靜態數據成員的初始化是在類的構造函數之前就完成的,如果靜態數據成員是基本類型,沒有將其進行初始化,那么它得到的就是基本類型的標準初值。如果是一個對象引用,那么除非新創建一個對象,并指派給該引用,否則它就是空值(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();
?
}
那么輸出的結果如下:
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)
得出如下結論:
靜態成員在初始化以后,就不再進行初始化,不管創建多少個對象,靜態數據成員只占有一份內存空間;
靜態成員根據在類中的順序進行初始化;
靜態成員數據之后就是非靜態成員數據,然后再構造函數,因為構造函數可能使用成員數據,所以成員數據會在構造函數之前就初始化;
通過改變main函數所在類最后兩個初始化語句的位置得到:
如果將其移到main函數里面,結果就報錯:非法的表示式開始,說明在函數中不能定義static的變量,static變量只能是class的,而且local變量除了可以用final以外,不能使用其它modifier;
如果將靜態的改成非靜態也報錯,無論放在main函數之前還是之后都報錯,因為在static函數中不能
引用非static變量;
不過 貌似樓主是寫C的 JAVA代碼很不規范哦·~~
而且JAVA 沒有函數這個東西了 只有方法 類里面的聲明的也不叫變量 叫成員
嘿嘿 小意見