我們在聲明屬性或方法的時候經常會使用關鍵字static(靜態的),那麼什麼時候該使用這個關鍵字,什麼時候不用這個關鍵字呢?
關鍵字static允許成員變量或方法不與類的特定實例關聯,類屬性與類有關,他所修飾的變量是全類共享的屬性, 而不是類的某個實例.比如編寫如下程序:
public class St {
private static String name;
private int age;
public static void main(String[] args) {
St s1=new St();
St s2=new St();
s1.name="zhangsan";
s2.name="lisi";
System.out.println("s1.name= "+s1.name);
System.out.println("s2.name= "+s2.name);
}
}
運行結果:
s1.name= lisi
s2.name= lisi
從結果可以看出,雖然實例化了兩個St對象,並賦值,但是由於變量name是靜態的,故修飾的變量是全類共享的屬性,只要一個改變,所有的就要跟着改變.
很多時候,我們也把常量屬性聲明爲static格式的,如:public static final float PI=3.1415;
一般地,類的靜態成員被稱爲類成員.類方法所修飾的方法一般都是工具類的工具方法.被static聲明的成員變量或方法都被認爲是全局的,其他任何類可以直接訪問靜態的成員變量或調用靜態方法,而不需要實例化一個對象. 非靜態的成員變量和方法被稱爲實例成員.
靜態方法和靜態成員變量不能使用引用來訪問,引用是類的是理論,而我們不需要類的實例化來訪問靜態成員,直接使用類名.成員變量(或成員方法).
由於static屬性或方法先被類加載器加載,故靜態方法不能訪問非靜態的方法或屬性(即實例化成員),只能訪問靜態屬性或方法,而非靜態方法可以訪問靜態方法.
static除了聲明靜態成員變量和方法外,還有另外一種用法,Java類包含了一個靜態初始化塊,靜態初始化塊是一組當子類被JVM的類加載器加載時執行的語句.比如:
public class Radio {
private int station;
public Radio(int x){
System.out.println("正在構造一個收音機對象");
station=x;
}
static{ //靜態初始化塊格式
System.out.println("在靜態初始化塊內"); //運行時就開始加載
}
public static void main(String[] args) {
System.out.println("在main方法內");
Radio r1=new Radio(2);
Radio r2=new Radio(8);
}
運行結果:
在靜態初始化塊內
在main方法內
正在構造一個收音機對象
正在構造一個收音機對象
從上面可以看出,儘管實例化了兩個對象,但是類的靜態初始化塊只能被加載一次.
這個和實例化塊有點不一樣,實例化塊是類的對象每次實例化一次時就執行一次,而且是在任何父類構造器調用之後,在子類構造器調用之前執行.