java溫習*(6):關於super的常見問題

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不能共存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章