先看下面的程式:
package c05.net;
class bowl
void f1()
}class cupboard
static bowl b3 = new bowl(3);
}class table
table(string a,int i)
}public class order
public static void main(string args)
}執行結果:
bowl(2)
bowl(3)
bowl(1)
cupboard()
creating new cupboard() in main
bowl(1)
cupboard()
creating new cupboard() in main
bowl(10)
oktable()
ok分析:首先程式從public類開始,裝載order,class,執行static cupboard t1 = new cupboard();
由於t1是乙個物件引用變數,首先得到初始化,然後轉到cupboard類的例項中,這時候程式開始初始化
該例項中的變數,按照先static後非static變數初始化的順序原則開始初始化各個變數,此時,
static bowl b2 = new bowl(2);
static bowl b3 = new bowl(3);
這兩塊先得到初始化
然後 bowl b1 = new bowl(1);得到初始化(注意,這是非stataic變數)
然後轉到cupboard() 建構函式。
此時cupboard類已經初始化完畢,程式返回到public類中,又發現有 static table t2;
開始初始化,由於t2只是個宣告的變數,並沒有建立乙個table物件讓它指向,因此不要管這個t2變數。
在public類中,由於此時再沒有static變數可以初始化,那麼程式轉到static方法main中進行,
(注意:bowl t3 = new bowl(10); 這一句為什麼得不到初始化,是因為此時沒有建立類order的例項,所以程式目前還不會初始化該**,至於以後會不會初始化,還要看在main方法中是否會建立order類的例項,如建立了,則一定初始化,否則不會。)
在main方法中,
system.out.println("creating new cupboard() in main");//首先列印該行要輸出的語句
new cupboard(); //建立了cupboard類的例項,程式轉到cupboard中進行變數初始化,此時要注意:
static變數的初始化,它只能初始化一次,也就是說,如果前面已經初始化過了,那麼此時就不必要再初
始化了,這一點要牢記!!!
system.out.println("creating new order() in main");//程式轉入此行列印要輸出的語句
order od = new order();//建立order物件例項,程式轉入例項od中,此時bowl t3 = new bowl(10);
這一句的t3會得到初始化,程式轉到bowl類中進行有關的操作,操作完後返回到main方法中
od.t3.f1(); //呼叫例項t3中的方法f()
table t4 = new table("aa",1); //建立table類的例項,讓t4指向這個例項,t4得到初始化,呼叫table含
有引數的構造方法,程式進行下去。
這樣就完成了對這個程式的真個的流程的分析,如果有錯誤的地方,或者還要補充的地方,還希望大家
指點一下,謝謝!!!
最後再總結一下:
初始化順序是:
(1) 先是父類的static變數和static初始化塊
(2)然後是子類的static變數和static初始化塊
(3)父類的例項變數、初始化快
(4)父類的構造方法
(5)子類的例項變數、初始化快
(6)子類構造方法
Java靜態變數和非靜態變數
記憶體分配 靜態方法和靜態變數建立之後一直使用同一塊記憶體,是連續的。非靜態方法會存在於記憶體的多個地方,是離散的。生命週期 靜態變數的生存週期是應用的生存週期。非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能是 class.靜態變數 來呼叫,類的例項不能呼叫。非靜態變數在變數...
靜態變數和非靜態變數
class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...
java 靜態變數 與 非靜態變數
一 建立乙個類的物件時 new 類名 時,該類的.class檔案會被載入到一段記憶體中。1.先將該類的.class檔案會被載入到一段記憶體,初始化static屬性和方法,為他們分配空間,以後一直在記憶體中,即使這個物件被銷毀。這就是不建議使用static屬性和方法的原因之一 2.copy其中非sta...