首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java 每日一題】構造器鏈與死循環陷阱:20161117 解析

     編輯:Java 綜合教學

【Java 每日一題】構造器鏈與死循環陷阱:20161117 解析

今天分析一道經典的構造器遞歸調用題目,揭示物件初始化過程中隱藏的堆疊溢位風險。

題目代碼

public class Ques1117 {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.doThing();
    }
}
class Parent {
    Parent() { new Other(); }
}
class Sub extends Parent {
    public void doThing() { System.out.println("Sub doThing..."); }
}
class Other {
    public Other() { new Sub(); }
}

執行流程推演

  1. main 執行 new Sub()
  2. Sub 無顯式構造器,隱式調用 super() → Parent()
  3. Parent() 執行 new Other()
  4. Other() 執行 new Sub() → 回到步驟 1

形成無限遞歸:Sub → Parent → Other → Sub → ...

運行結果

Exception in thread "main" java.lang.StackOverflowError
    at Parent.(Ques1117.java:...)
    at Sub.(Ques1117.java:...)
    at Other.(Ques1117.java:...)
    at Parent.(Ques1117.java:...)
    ...

Sub doThing... 永遠不會輸出,因為物件根本無法完成初始化。

核心知識點

  • 子類構造器必須首先調用父類構造器 (super())
  • 構造器中避免創建同類型或父類型實例,極易形成遞歸循環
  • StackOverflowError 屬於 Error,不可捕獲恢復,只能修正設計

最佳實踐

  • 構造器保持輕量,僅做欄位初始化
  • 複雜物件創建移至工廠方法或建造者模式
  • 引入靜態分析工具 (SpotBugs, SonarQube) 檢測構造器循環
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved