理解static執行順序

 

運行結果如下
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
===========================

##static型的變量或者方法叫做類變量和類方法
類變量是在該類加載到內存的同時就進行初始化的
而非static變量是在產生實例時進行初始化

因爲要執行一個static方法main(),因此要先把該類加載到內存並同時進行static變量的初始化

因此static Bowl bl = new Bowl(1);要在main函數開始執行之前就執行了

##看一下編譯StaticInitialization.java的class目錄,會發現雖然編譯的只是一個.java文件,但由於java文件裏聲明瞭4個class,所以實際由這個java文件產生了4個class文件。
下面,你看是運行StaticInitialization.class,此時系統只載入這個類,其它三個類還沒有載入,而在StaticInitialization.class有兩句static語句,於是系統開始尋找這兩句語句指定的類Table 和 Cupboard ,找到了開始載入,所以載入就發生了,自然也就開始初始化這兩個類中的static。

##當類被裝入jvm的時候,static的代碼執行一次,以後就不再執行

##這個例子體現了類變量和實例變量的區別:
類變量即在變量前有"static"修飾,沒有的即爲實例變量;
類變量在每個類中只出現一次,不管這個類創建了多少實例,它使用的內存僅分配一次;
而實例變量是爲類的每個實例分配的,在創建類的實例時,系統就爲這個類中的所有實例變量分配內存。
在上面的例子中,由於b3是實例變量,所以每分配一個實例,就創建一個新的b3,所以它的輸出是多次的

 

##構造類前先構造父類(如果父類還有父類,則先構造這個父類的父類,類推)
構造類的時候,先構造static變量(按代碼順序),構造完成後,構造非static變量
變量全部構造好以後,進入構造函數

##靜態變量初始化是在類被初次調用的瞬間發生的,類中的非靜態變量是在進入構造函數內部前初始化的,記住這兩點,就可以很清楚地理解你的輸出
當涉及到一個類時總會生成靜態成員;然後若要生成這個類的實例,再調用initializer(默認的或人爲創建的);調用構件器;完成創建。若運行一個類則會在初始化完靜態成員後進入main這個入口,不會創建類的實例,除非在main的實現裏有new出實例的代碼。
##jvm先要構造靜態對象,然後調用main(),,在對static的定義中指出,在編譯時當裝載一個類時會先裝載其中的靜態的方法。後纔是構造方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章