2015-09-24 41 views
-3
public class B { 

    public static void main(String[] args) { 
     A a = new A(); 
    } 
} 

public class A { 

    A b = new A(); 
} 
+0

你爲什麼認爲它不應該?什麼初始化'A'實例呢? –

+0

由於無限循環 –

+0

它在堆內存中創建一個新對象'a',然後創建一個對象'b'。我無法理解爲什麼這些會導致堆棧溢出 –

回答

1

因爲每個A都會創建一個名爲b的內部字段,其類型爲A。這是無限的recurisve,因爲要創建一個b您還必須創建一個A(它增加了另一個b)。因爲初始值設定項被複制到默認的構造函數中,所以您的示例相當於類似的東西,

public class A { 
    // A b=new A(); 
    A b; 
    public A() { 
     super(); 
     b = new A(); 
    } 
} 
+0

謝謝@Elliott Frisch的詳細解答。 –

0

我不理解您的要求。爲什麼你在同一個類中聲明瞭實例變量。它將表現得像一個遞歸循環。從主要方法中,它將嘗試創建類A的對象,並在該對象創建期間嘗試初始化變量「a」。結果它又會創建A的另一個實例等等。

相關問題