1. 程式人生 > >java基礎(初始化和清理)

java基礎(初始化和清理)

靜態對象 構造 inf 靜態代碼塊 變量 csdn 地址 .net err

一個java初始化的例子

技術分享圖片

運行結果

技術分享圖片

結論:執行main方法,必須加載test2類,然後靜態域b和c被初始化,然後他們對應的類被加載,由於他們對應的類也包含靜態A對象,所以A也被加載,所以在這個程序中,所有的類在main()開始之前就都被加載了。初始化的順序是先靜態對象,而後是非靜態對象。靜態初始化只有在類被初始化時才會創建,只有在第一次對象被初始化,或者第一次訪問靜態數據的時候,他們才被初始化,此後,靜態對象不會再次被初始化。

疑問?

在看thinking in java 第四版189頁中提到“即使沒有顯示地使用static關鍵字,構造器實際上也是靜態方法”這句話產生了疑問,如果構造器是靜態的話,那麽裏面的字段和方法也必須是靜態的了,但是實際使用過程中並不是這樣。對於這個疑問,網上查閱資料,這可能是作者的一個小錯誤。貼上具體博客地址 https://blog.csdn.net/bluetjs/article/details/52598635 。附上一段代碼驗證:

技術分享圖片

摘抄一段解釋:

-------------------------------------------------------------------------------------------------------------

java語言規範裏有這麽一句話

Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.

實例構造器無法被隱藏或覆寫,不參與多態,因而可以做靜態綁定。從這個意義上可以認為實例構造器是“靜態”的,但這種用法與Java語言定義的“靜態方法”是兩碼事

--------------------------------------------------------------------------------------------------------------

疑問結束

java的初始化順序,貼上一段代碼

父類:

技術分享圖片

子類:

技術分享圖片

主方法:

技術分享圖片

運行結果:

技術分享圖片

在沒有把初始化的順序了解透徹的話很容易會理所當然的理解為先執行父類的靜態代碼塊再執行父類的代碼塊,然後再執行子類的靜態代碼塊再執行子類的代碼塊,在第一次看到這個程序的時候我也犯了同樣的錯誤,並且在執行父類初始化的時候調用的show方法理所當然的認為是調用了父類的show方法,其實初始化的是子類的對象,調用的是被子類重寫的show方法。

得出結論,初始化的順序:

父類靜態變量、 父類靜態初始塊 (它們的在類中的順序就決定了它們的初始化順序,而不是變量一定會優先於初始塊)> 子類靜態變量 、子類靜態初始塊 > 父類成員變量 、父類非靜態初始塊(順序執行,debug下看到不在代碼塊中輸入成員變量,沒有執行到成員變量初始化時,成員變量為null) > 父類構造器 > 子類成員變量 、 子類非靜態初始塊 (順序執行)> 子類構造器

清理:

JAVA垃圾回收器負責回收無用對象占據的內存資源。垃圾回收器只釋放那些由new分配的內存。

1.對象可能不被垃圾回收

2.垃圾回收至於內存相關

java基礎(初始化和清理)