靜態(tài)數(shù)據(jù)成員的初始化是在類的構(gòu)造函數(shù)之前就完成的,如果靜態(tài)數(shù)據(jù)成員是基本類型,沒(méi)有將其進(jìn)行初始化,那么它得到的就是基本類型的標(biāo)準(zhǔn)初值。如果是一個(gè)對(duì)象引用,那么除非新創(chuàng)建一個(gè)對(duì)象,并指派給該引用,否則它就是空值(null)。看下面一個(gè)例子:
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)成員在初始化以后,就不再進(jìn)行初始化,不管創(chuàng)建多少個(gè)對(duì)象,靜態(tài)數(shù)據(jù)成員只占有一份內(nèi)存空間;
靜態(tài)成員根據(jù)在類中的順序進(jìn)行初始化;
靜態(tài)成員數(shù)據(jù)之后就是非靜態(tài)成員數(shù)據(jù),然后再構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)可能使用成員數(shù)據(jù),所以成員數(shù)據(jù)會(huì)在構(gòu)造函數(shù)之前就初始化;
通過(guò)改變main函數(shù)所在類最后兩個(gè)初始化語(yǔ)句的位置得到:
如果將其移到main函數(shù)里面,結(jié)果就報(bào)錯(cuò):非法的表示式開(kāi)始,說(shuō)明在函數(shù)中不能定義static的變量,static變量只能是class的,而且local變量除了可以用final以外,不能使用其它modifier;
如果將靜態(tài)的改成非靜態(tài)也報(bào)錯(cuò),無(wú)論放在main函數(shù)之前還是之后都報(bào)錯(cuò),因?yàn)樵趕tatic函數(shù)中不能
引用非static變量;
不過(guò) 貌似樓主是寫C的 JAVA代碼很不規(guī)范哦·~~
而且JAVA 沒(méi)有函數(shù)這個(gè)東西了 只有方法 類里面的聲明的也不叫變量 叫成員
嘿嘿 小意見(jiàn)