java父類構造函數
1. java中 子類與父類構造方法的關系 個人理解
編寫JAVA作業時在繼承的環節發現了一些錯誤,希望總結一些規律:(以下全部屬於自己歸納,可能有問題)
一句話概括就是:子類一定會調用(不是繼承)父類的構造方法!
即遵循一個原則:子類的構造一定是在父類已構造的基礎上!
這句話要分為幾種情況來理解(下面只討論父類有構造函數):
子類構造函數自動調用super() (也可以手動加上)
但如果父類只有含參數的構造方法,那麼子類必須申明一個構造方法,其中包含對super(args)的調用
一、父類含有無參構造函數
1、子類沒有構造方法或者含有無參的構造方法:
這種情況,都會默認地調用super()
2、子類含有有參數構造方法:
同樣會在首句默認調用super() //其實跟情況1類似
二、父類含有含參數的構造方法,不含無參數的構造方法:
子類沒得選擇:
子類必須申明一個構造方法(且含super的args),且方法里要首先調用super(args),否則報錯。
三、父類含 含參數的構造方法和無參的構造方法:
此時子類可以選擇性調用:
可以無構造方法:仍會默認調用super()
也可以有構造方法:其中會默認地調用super(),你也可以在開頭加上這句,如果你不希望調用父類默認的無參方法,那麼在 子類構造方法 中調用 父類含參構造方法。
上述看似情況復雜,其實基於其原則理解並不難。
綜上:java為了保持 子類的構造基於父類的構造 這一原則,子類構造時必須通過某些方式首先調用父類的構造方法,否則會報錯。
2. java 調用靜態方法和構造函數和靜態塊執行的先後順序
在Java中,靜態方法、靜態塊和構造函數的執行先後順序如下:
靜態塊先執行:
- 當類被載入時,靜態塊會首先被執行。靜態塊用於初始化靜態變數或執行類級別的初始化操作。
- 在示例中,ExA類的靜態塊先執行,輸出「父類–靜態代碼塊」,然後ExB類的靜態塊執行,輸出「子類–靜態代碼塊」。
靜態方法:
- 靜態方法是在類級別調用的,不依賴於類的實例。雖然靜態方法可以在任何時候被調用,但如果是在類載入過程中通過靜態塊或其他靜態方法間接調用,那麼它的執行順序會遵循類的載入順序。
- 注意,示例中沒有直接調用靜態方法,但理論上,如果靜態方法是在靜態塊中調用的,它會按照靜態塊的執行順序被執行。
構造函數最後執行:
- 構造函數是在創建類的實例時被調用的。在實例化過程中,首先會執行父類的非靜態代碼塊,然後是父類的構造函數,接著是子類的非靜態代碼塊,最後是子類的構造函數。
- 在示例中,當執行new ExB時,首先執行ExA類的非靜態代碼塊,然後是ExA類的構造函數,接著是ExB類的非靜態代碼塊,最後是ExB類的構造函數。
重點內容: 靜態塊在類載入時執行,用於初始化靜態成員。 構造函數在實例化對象時執行,用於初始化對象。 靜態方法的執行順序依賴於其調用時機,但通常不會在實例化過程中執行。
通過理解這些執行順序,可以更好地掌握Java類的載入和初始化過程。
3. java中的super()是什麼
在Java中,super是一個用於調用父類構造函數的語法糖。具體來說:
調用父類構造函數:在子類的構造函數中,super用於顯式地調用父類的構造函數。這是確保父類正確初始化的重要步驟。如果子類構造函數中沒有顯式調用父類構造函數,Java編譯器會自動插入一個對父類無參構造函數的調用。但如果父類沒有無參構造函數且子類構造函數中沒有顯式調用其他父類構造函數,則會導致編譯錯誤。
訪問父類成員:除了調用構造函數外,super還可以用於在子類中訪問父類的成員,特別是當子類重寫了父類的方法或隱藏了父類的欄位時。通過使用super.member,可以確保訪問到的是父類的成員而非子類自己的成員。
非變數:需要注意的是,super並不是一個真正的變數,而是一個關鍵字,它不能用作賦值、比較等操作。它主要用於上述的構造函數調用和父類成員訪問。
與this的區別:this關鍵字用於表示當前對象的引用,可以用於調用當前對象的方法、訪問當前對象的欄位等。而super則專門用於與父類相關的操作,如調用父類構造函數和訪問父類成員。理解這兩個關鍵字的區別對於編寫正確和高效的Java代碼至關重要。