2013-03-08 78 views
1

我有一個互相引用兩個類:解釋爲什麼這個代碼不工作

class B{ 
    A obj; 
    B(A obj){ 
    this.obj=obj; 
    } 
    void display(){ 
    System.out.println(obj.data);//using data member of A class 
    } 
} 

class A{ 
    int data=10; 

    A(){ 
    B b =new B(new A()); // THIS LINE GENERATES AN ERROR 
    b.display(); 
    } 
    public static void main(String args[]){ 
    A a=new A(); 
    } 
} 

如果我改變了違規行改爲

B b =new B(this); 

然後它工作。我認爲這兩條線做同樣的事情。爲什麼一個人工作,而不是另一個?

此外,從第一個版本的編譯器錯誤讀取

A.<init><A.java:15> 

這是什麼意思?

+2

準確地說你的問題是什麼?你認爲這應該會導致編譯/運行時錯誤?這是有效的代碼 – 75inchpianist 2013-03-08 19:03:28

+0

新的A()總是創建一個新對象,一個新的對類的引用,並且調用構造函數,在這種情況下,這個循環會無限延伸,而如果你傳遞「this」 - 它引用當前對象。爲了簡化 - 新建A() - 創建一個新對象,這不會使用當前對象創建一個新對象 – din 2013-03-08 19:15:55

+1

有史以來最好的編輯@Nathaniel! – Simon 2013-03-08 19:32:43

回答

13

通過在A()內調用new A(),您將產生一個調用構造函數的無限循環。這是錯誤。

,我會更詳細地解釋給你聽: 當您通過this進入new B(...)構造函數,你傳遞一個參考A類的新構造的對象,它的構造函數,你目前的內部。這是可以的,因爲除了構建新的B之外,它不會引起任何進一步的操作。

當您將其替換爲new A()時,您必須首先生成A類的新實例。這還沒有問題。問題是當你進入構造函數A() { ... }時,所有事情都會重新開始:你會到達B b =new B(new A());行,並且會再次調用A構造函數,這個構造函數會重新返回到這一行,直到你收到StackOverflowError

+1

不完全是遞歸的理想介紹,amirite? – bernie 2013-03-08 19:03:37

+0

@bernie唔... :) – Andremoniy 2013-03-08 19:04:24

+1

堆棧溢出:p – din 2013-03-08 19:09:20

相關問題