資源描述:
《java對象與內存管理機制》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、1.實例變量和類變量的內存分配類變量:使用static修飾的成員變量是類變量,屬于該類本身實例變量:沒有使用static修飾的成員變量是實例變量,屬于該類的實例由于同一個JVM內每個累只對應一個Class對象,因此同一個JVM內的一個類的類變量只需一塊內存空間。對于實例變量而言,該類沒創(chuàng)建一次實例,就需要為實例變量分配一塊內存空間,所以,程序中有幾個實例,實例變量就需要幾塊內存空間。2.類變量的初始化時機總是出于實例變量的初始化之前我們先看下下面三段代碼:1)因為兩個實例變量都是在創(chuàng)建變量的時候才
2、開始分配空間,此時num2還沒有分配,所以前向引用就會出現(xiàn)編譯錯誤。12intnum=num2+3;//非法前向引用,會報錯intnum2=22)因為兩個類變量在JVM加載類的時候分配空間,此時num2還沒有分配,所以前向引用就出現(xiàn)變異錯誤。12staticintnum=num2+3;//非法前向引用,會報錯taticintnum2=23)因為類變量num2在JVM加載類的時候空間已經分配好,而num在創(chuàng)建實例的時候踩分配空間,此時num2已經分配成功了,所以num前向引用成功。12intnum=
3、num2+3;//正確使用staticintnum2=2;由上面三段代碼塊就可以驗證得:類變量的初始化時機總是出于實例變量的初始化之前3.Java對象的初始化方式及其執(zhí)行順序Java對象的初始化方式有三種:1)構造器2)初始化塊3)定義變量時指定初始化值如果這三種初始化方式同時出現(xiàn),也要注意,他們也有一個執(zhí)行順序的規(guī)定:1)靜態(tài)初始化塊只在類第一次創(chuàng)建對象的時候運行一次,后面就不會再運行,而類在每次創(chuàng)建對象時,非靜態(tài)初始化塊總是會運行一次。1234567891011121314151617publ
4、icclassTest{static{System.out.println("執(zhí)行---靜態(tài)初始化代碼塊.");}{System.out.println("執(zhí)行---非靜態(tài)初始化代碼塊.");}publicstaticvoidmain(String[]args){for(inti=1;i<=2;i++){System.out.println("創(chuàng)建第"+i+"個對象");newTest();System.out.println();}}}運行結果:2)構造器每次創(chuàng)建對象時,構造器必然有執(zhí)行的機會,
5、此時,非靜態(tài)初始化塊必定也將獲得機會并且運行在構造器之前123456789101112131415161718publicclassTest{{System.out.println("執(zhí)行---非靜態(tài)初始化代碼塊.");}publicTest(){System.out.println("執(zhí)行---構造器.");}publicstaticvoidmain(String[]args){for(inti=1;i<=2;i++){System.out.println("創(chuàng)建第"+i+"個對象");newT
6、est();System.out.println();}}}運行結果:3)定義變量時指定的初始化值和初始化塊中指定的初始值的執(zhí)行順序與他們在源程序中的排列順序相同。驗證代碼一:12345678910111213141516publicclassTest{Stringi="定義變量時指定的初始化值";{i="初始化塊中指定的初始值";}publicstaticvoidmain(String[]args){for(inti=1;i<=2;i++){System.out.println("創(chuàng)建第"+i+
7、"個對象");System.out.println(newTest().i);System.out.println();}}}運行結果驗證代碼二:1234567891011121314publicclassTest{{i="初始化塊中指定的初始值";}Stringi="定義變量時指定的初始化值";publicstaticvoidmain(String[]args){for(inti=1;i<=2;i++){System.out.println("創(chuàng)建第"+i+"個對象");System.out.p
8、rintln(newTest().i);System.out.println();}}1516}運行結果:4.關于父子實例的內存控制(一般情況下是不用內部類來驗證的,但是都是一樣的啦,我偷懶下,所以使用了內部類,大家原諒哈)1)當子類重寫父類方法后,父類表面上只是調用屬于自己的被子類重寫的方法。12345678910111213141516171819202122232425publicclassTest{classBase{Base(){this.info();}publicvo