靜態(tài)數(shù)據(jù)成員的初始化是在類的構(gòu)造函數(shù)之前就完成的,如果靜態(tài)數(shù)據(jù)成員是基本類型,沒有將其進行初始化,那么它得到的就是基本類型的標(biāo)準(zhǔn)初值。如果是一個對象引用,那么除非新創(chuàng)建一個對象,并指派給該引用,否則它就是空值(null)。看下面一個例子:
StaticInitialization.java
class Bowl{
?Bowl(int marker){
??System.out.println("Bowl("+marker+")");
?}
?void f(int marker){
??System.out.println("f("+marker+")");
?}
}
class Table{
?static Bowl b1=new Bowl(1);
?Table(){
??System.out.println("Table()");
??b2.f(1);
?}
?void f2(int marker){
??System.out.println("f2("+marker+")");
?}
?static Bowl b2=new Bowl(2);
}
class Cupboard{
?Bowl b3=new Bowl(3);
?static Bowl b4=new Bowl(4);
?Cupboard(){
??System.out.println("Cupboard()");
??b4.f(2);
?}
?void f3(int marker){
??System.out.println("f3("+marker+")");
?}
?static Bowl b5=new Bowl(5);
}
public class StaticInitialization{
?public static void main(String[] args){
??System.out.println("Creatin new Cupboard() in main");
??new Cupboard();
??System.out.println("Creatin new Cupboard() in main");
??new Cupboard();
??t1.f2(1);
??c1.f3(1);
?}
?static Table t1=new Table();
?static Cupboard c1=new Cupboard();
?
}
那么輸出的結(jié)果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creatin new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creatin new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
得出如下結(jié)論:
靜態(tài)成員在初始化以后,就不再進行初始化,不管創(chuàng)建多少個對象,靜態(tài)數(shù)據(jù)成員只占有一份內(nèi)存空間;
靜態(tài)成員根據(jù)在類中的順序進行初始化;
靜態(tài)成員數(shù)據(jù)之后就是非靜態(tài)成員數(shù)據(jù),然后再構(gòu)造函數(shù),因為構(gòu)造函數(shù)可能使用成員數(shù)據(jù),所以成員數(shù)據(jù)會在構(gòu)造函數(shù)之前就初始化;
通過改變main函數(shù)所在類最后兩個初始化語句的位置得到:
如果將其移到main函數(shù)里面,結(jié)果就報錯:非法的表示式開始,說明在函數(shù)中不能定義static的變量,static變量只能是class的,而且local變量除了可以用final以外,不能使用其它modifier;
如果將靜態(tài)的改成非靜態(tài)也報錯,無論放在main函數(shù)之前還是之后都報錯,因為在static函數(shù)中不能
引用非static變量;