請原諒任何小的語法錯誤或諸如此類的錯誤,我正在通過Jitsi模塊遇到這個問題并且不熟悉Java,想要確認發生了什么以及為什么以及如何修復它。 public abstract class A{ public A() { this.load(); } protected void load() { }}public class B extends A{ private String testString = null; public B() { super(); } @Override protected void load() { testString = "test"; }}應用程序在使用按名稱加載類方法創建類B的實例時執行此操作:在B類中調用重寫的load()初始化變量(根據調試器調用“private string testString = null”),將它們清零。這是預期的Java行為嗎?什么可能導致這個?它是在1.7 JDK上運行的Java 1.6應用程序。
2 回答

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
這是預期的Java行為嗎?
是。
什么可能導致這個?
您在非final超類構造函數中調用非最終重寫方法。
讓我們一步一步看看會發生什么:
您創建一個實例
B
。B()
調用超類構造函數 -A()
來初始化超類成員。A()
現在調用一個在B
類中重寫的非final方法,作為初始化的一部分。由于上下文中的實例是
B
類,因此load()
調用的方法是B
類。load()
初始化B
類實例字段 -testString
。超類構造函數完成作業,并返回(假設構造函數的鏈接
Object
已經完成)該
B()
構造函數開始執行進一步,初始化它自己的成員。現在,作為啟動過程的一部分,
B
覆蓋先前的寫入值testString
,并將其重新初始化為null
。
道德:永遠不要在其構造函數中調用非最終類的非最終公共方法。
添加回答
舉報
0/150
提交
取消