1、子類構造默認調用父類無參構造方法,那麼如果父類中沒有無參的構造方法只有有參的構造方法,一定會編譯報錯嗎?編譯報錯是否就代表無法正常運行?
答案是:此時一定會編譯報錯,但不一定會無法正常運行,需要看具體編碼情況。
下面我們結合示例來看一下:譬如設定自定義類:Paternal、Modern爲繼承關係,且滿足父類中只有帶參構造方法。定義Test類爲測試類,完成Modern對象構建。
Ps:此處由於展示篇幅有限,暫不考慮屬性的訪問權限
- 子類中沒有任何構造方法中通過super調用父類指定帶參構造
此時能明顯看出,兩個編譯錯誤提示,具體信息爲:由於父類沒有無參構造,因此需要調用其他構造方法。
測試類爲:
運行結果,產生異常,原因爲:父類沒有無參構造,因此必須調用其他構造方法,否則無法完成指定對象創建。
由此可見,當父類中只有帶參構造,子類中沒有任何構造方法中通過super調用父類指定帶參構造得時候,一定會編譯報錯,同時也會產生運行異常。
- 子類中部分構造方法通過super調用了父類指定的帶參構造
修改子類帶參構造,使用super調用父類對應構造,無參構造不動
此時錯誤提示仍爲:由於父類沒有無參構造,因此需要調用其他構造方法。
測試類不變,則運行結果爲
如,調整測試類爲:
運行結果,產生異常,原因爲:父類沒有無參構造,因此必須調用其他構造方法,否則無法完成指定對象創建。
由此可見,當父類中只有帶參構造,子類中如只有部分構造方法通過super調用父類指定帶參構造得時候,依然會產生編譯異常;但此時,如在測試類中,調用的是已經處理過的子類構造則不會產生運行時異常(Ps:處理指應用super調用過指定父類構造)。
簡單來說,可以理解爲,編譯出錯只是提醒代碼有漏洞,但是運行時如果不執行漏洞代碼,則不影響正常的運行結果。
2、如果子類通過super來調用父類的帶參構造,那麼是不是父類當中就可以不需要定義無參構造了?
如果只是考慮當前功能實現,的確可以不在父類中定義無參構造方法了;但是如果考慮到後續功能擴展,還是建議大家在父類中保留無參構造的編碼。
3、請問如果子類構造方法調用了this(),那麼還會默認調用父類的super()嗎?
答案是:肯定會。
因爲,當子類的帶參構造方法調用this(),意思是,調用了同類中的無參構造方法,
而在子類的無參構造方法中如果沒有通過super設定,則默認會調用其父類的無參構造方法,也就是編譯器會自動在子類無參構造方法中添加super()。
下面我們結合示例來看一下:譬如設定自定義類:Paternal、Modern爲繼承關係,且滿足父類中只有帶參構造方法。定義Test類爲測試類,完成Modern對象構建。
Ps:此處由於展示篇幅有限,暫不考慮屬性的訪問權限
運行結果爲:
- this和super不能再靜態方法中使用
- this和super不能共存