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