為什麼用static來修飾方法或者變數,有什麼好處
對於用static修飾的變數稱為靜態變數,也叫類變數。由類建立的所有物件都可以共用這個變數。類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在,而且僅一份。
順便說一下例項變數,例項變數是類new了一個物件之後才有的,每個物件有自己的那一份。
當一個方法或者變數需要初始化載入,或者是經常被呼叫的時候可以加上static。用static修飾的方法可以用類名直接呼叫,不用的一定要先例項化一個物件然後才可以呼叫。
用static修飾的方法叫靜態方法,也叫類方法。
隨著類的載入而載入,就算沒有new一個物件,類方法還是存在,且僅存在一份。
類方法內部可以呼叫靜態的變數和靜態的方法,而不能呼叫非靜態的變數和方法;反之,非靜態方法可以呼叫靜態的變數和方法。
結合程式碼理解一下:
public class ExtB{ /類變數和例項變數都是全域性變數,無須初始化 兩者的區別是: 類變數由static修飾,由所有物件共享 例項變數不用static修飾,由每個物件各自佔有自己的,類似於在例項化時建立了例項變數的副本 / static int i = 10;//不必須初始化 int j = 20 ;//不必須初始化 public ExtB(int j) { this.j = j; } public ExtB() { } public void hello(){ System.out.println("Hello,我是非靜態方法~"); System.out.println("Hello,我是非靜態方法~我在呼叫類變數i= " + i); System.out.println("Hello,我是非靜態方法~我在呼叫例項變數j= " + j); System.out.println("Hello,我是非靜態方法~我在呼叫靜態方法helloStatic()"); helloStatic(); } public void hello1(){ hello();//非靜態方法呼叫非靜態方法沒有問題 System.out.println(j);//非靜態方法呼叫非靜態變數沒有問題 } public static void helloStatic() { System.out.println("Hello,我是靜態方法~"); System.out.println("Hello,我是靜態方法~我在呼叫類變數i= " + i); //System.out.println("Hello,我是靜態方法~我在呼叫例項變數j= " + j);//報錯,非靜態變數不能直接呼叫 } public static void main(String[] args) { int x;//區域性變數必須初始化 ExtB extb1 = new ExtB(30); ExtB extb2 = new ExtB(40); System.out.println("ExtB.i= "+ExtB.i); System.out.println("extb1.i= "+extb1.i); System.out.println("extb2.i= "+extb2.i); System.out.println("--------------------"); //System.out.println("ExtB.j= "+ExtB.j);//報錯,非靜態變數不能直接呼叫 System.out.println("new ExtB(1).j= "+new ExtB(1).j); System.out.println("extb1.j= "+extb1.j); System.out.println("extb2.j= "+extb2.j); System.out.println("--------------------"); //System.out.println(x);//報錯,區域性變數必須初始化 ExtB.helloStatic();//呼叫靜態方法,沒有問題,或者直接helloStatic();也行 System.out.println("--------------------"); //hello();//報錯,非靜態方法不能直接呼叫 new ExtB().hello(); System.out.println("--------------------"); } }
再給一個單例模式一種寫法:
class Single {
private static Single single = null;
public static Single getInstance(){
synchronized (Single.class) {
if (single == null) {
single = new Single();
}
}
return single;
}
}