1. 程式人生 > >安全程式設計(十二) - static

安全程式設計(十二) - static

1.引言

        java中被static修飾的成員叫做靜態成員或類成員。她屬於整個類所有,而非某一個物件所有,即被類的所以物件所共享。靜態成員可以使用類名直接訪問,也可以使用物件名進行訪問。大多時候推薦使用類名進行訪問。

        static可以修飾變數、程式碼、方法塊。

        靜態成員屬於整個類,當第一次使用該類時系統會為她分配記憶體空間,直到該類被解除安裝才會回收資源空間。

2.例項

2.1靜態變數:

        在一個類中定義一個靜態變數:

package cn.nuist.pers.September20;

public class StaticVariable {

	static String str1 = "isleiyi";
	
	public static void main(String[] args) {
	
		System.out.println("1.output:" + StaticVariable.str1);  //1.直接通過類名進行訪問,無需建立物件
		
		StaticVariable staVar = new StaticVariable();  //2.建立類的物件
		System.out.println("2.output:" + staVar.str1);     //使用類的物件訪問靜態變數
		
		staVar.str1 = "newleiyi";  //3.使用物件名的形式來修改靜態變數的值
		System.out.println("3.output:" + staVar.str1);  //修改後的靜態變數的值
		
	}
}

輸出結果:

1.output:isleiyi
2.output:isleiyi
3.output:newleiyi

2.2靜態方法:

        用static修飾的方法叫做靜態方法,如我們常使用的main也是靜態方法。靜態方法的使用如下:

package cn.nuist.pers.September20;

public class StaticMethod {

	public static void print() {
		System.out.println("StaticMethod Test");
	}
	public static void main(String[] args) {
		
		StaticMethod.print();  //直接使用類名呼叫靜態方法
		
		StaticMethod staMet = new StaticMethod();  //建立物件呼叫靜態方法
		staMet.print();
	}
}

結果:

StaticMethod Test
StaticMethod Test

2.2.1靜態方法中可以直接呼叫同類的靜態成員,但不能呼叫非靜態成員。

package cn.nuist.pers.September20;

public class StaticMethodTest1 {

	String str1 = "helo";  
	static String str2 = "hello";
	public static void main(String[] args) {
		System.out.println("str1 output:" + StaticMethodTest1.str1);  //呼叫非靜態變數
		System.out.println("str2 output:" + StaticMethodTest1.str2);  //呼叫靜態變數
	}
}

結果:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Cannot make a static reference to the non-static field StaticMethodTest1.str1

	at cn.nuist.pers.September20.StaticMethodTest1.main(StaticMethodTest1.java:8)

如果希望在靜態方法中呼叫非靜態成員,可以建立該類的物件,然後通過物件來訪問非靜態成員。

package cn.nuist.pers.September20;

public class StaticMethodTest1 {

	String str1 = "helo";  
	static String str2 = "hello";
	public static void main(String[] args) {
//		System.out.println("str1 output:" + StaticMethodTest1.str1);  //呼叫非靜態變數會出錯
		
		StaticMethodTest1 smt = new StaticMethodTest1();   //建立該類的物件來呼叫非靜態成員
		System.out.println("str1 output:" + smt.str1);
		
		System.out.println("str2 output:" + StaticMethodTest1.str2);  //呼叫靜態變數
	}
}

結果:

str1 output:helo
str2 output:hello

2.2.2在普通成員方法中,可以訪問到該類中的非靜態成員和靜態成員。

package cn.nuist.pers.September20;

public class StaticMethodTest2 {

	String str1 = "helo";
	static String str2 = "hello";
	
	public void show() {   //普通成員方法可以訪問到靜態非靜態變數
		System.out.println("1.output:" + str1);
		System.out.println("2.output:" + str2);
	}
}

2.2.3靜態方法中不能直接呼叫非靜態方法,需要通過建立物件來呼叫非靜態方法。

package cn.nuist.pers.September20;

public class StaticMethodTest3 {

	public void show() {
		System.out.println("helo");
	}
	public static void print() {
		System.out.println("Helo");
	}
	public static void main(String[] args) {
		StaticMethodTest3 smt3 = new StaticMethodTest3();  //靜態方法不能直接呼叫非靜態方法,需要
		smt3.show();                                       //通過物件來呼叫
		
		print();    //可以直接呼叫靜態方法
	}
}

結果:

str1 output:helo
str2 output:hello

3.總結

多動手,多動腦;活到老,學到老!

參考資料:https://www.cnblogs.com/dianqijiaodengdai/p/6144698.html