1、虛擬機首次加載類時,會對靜態(tài)初始塊,靜態(tài)對象,靜態(tài)方法進行一次初始化。
2、只有調用new方法時才會創(chuàng)建實例。
3、類實例創(chuàng)建過程:首先執(zhí)行父類初始化塊部分,然后是父類的構造方法。然后是子類的初始化快和構造方法。
4、類實例銷毀時,先銷毀子類部分,在銷毀父類部分。
打印內容:
1
2
3
a
4
實例化對象的過程:
1.檢查類是否加載,如果沒有加載就加載這個類,要加載所有父類;
懶式加載(按需加載):如果第一次用到加載,只加載一下.通過ClassPath制定的路徑尋找類文件(.class) 加載以后是一個對象,類型是class.獲得這個類對象:student.class-->class實例
2.在內存堆中分配對象空間.遞歸分配所有父類和子類屬性空間.先父類型再子類型,屬性默認自動初始化.自動初始化為"0"值;
3.進行屬性的賦值;
4.遞歸調用父類構造器.(默認調用父類無參構造器);
5.調用本類構造器
JAVA編程思想上是這么描述的:
1、當某個型別為Dog(這里用Dog表示一個類)的對象首次被產生出來,或是當class Dog的static函數(shù)或static數(shù)據(jù)成員首次被訪問,java直譯器必須查找環(huán)境變量classpath所指定的位置,找出Dog.class。
2、一旦Dog.class 被裝載,他的所有static動作就會被執(zhí)行起來。因此他的static初始化動作只會發(fā)生一次,就是在class對象首次被裝載時。
3、當你new Dog()時,構造過程會先為Dog對象在heap上分配足夠的存儲空間。
4、這塊存儲空間會被清為0,并自動將Dog對象內所有隸屬基本型別的數(shù)據(jù)設為缺省值(對數(shù)字來說是0),并將references設為null。
5、執(zhí)行所有出現(xiàn)于數(shù)據(jù)定義處的初始化動作。
6、執(zhí)行構造函數(shù)。
控制臺輸出結果:
this is static method~
0
this is static block
1
this is TestInstanceInit's constructor~
如果有一個變量怎么處理呢:
控制臺輸出結果: 靜態(tài)變量
靜態(tài)初始化塊
變量
初始化塊
構造器






