2016-06-26 64 views
-3

我看到很多例子說明了JAVA中的一對一或多對多關係。但我仍然不明白爲什麼這會起作用。爲什麼兩個類可以在JAVA中互相引用?

如果我有:

類A(){B B =新B();}

類B(){A A =新A();}

當我在main方法中以main方式爲起點時,JAVA如何分配內存來處理這種情況?不會記憶 - 分配是無止境的? A有B,那麼B有另一個A然後go on forever

千恩萬謝

進一步的問題:

我可以做這樣的事情呢?

class A(){B b; public void setB(B bb){}}

class B(){A a;公共無效組A(A,AA){}}

非常感謝

+1

您是否嘗試分配「A」?我建議你這樣做,我想你會找到你的答案。 –

+0

如果它是一對一的關係,則A具有相同的A,因此沒有無限的內存分配。 –

+0

@YassinHajaj不,它不是。 –

回答

3

Java不處理這種情況;如果我們正確的代碼和分配的A一個實例(以及使這些類static,所以我們可以在一個簡單的MCVE嵌入它),我們看到像

static class A { 
    B b = new B(); 
} 

static class B { 
    A a = new A(); 
} 

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

在執行時,拋出

Exception in thread "main" java.lang.StackOverflowError 

編譯時間,它通過耗盡堆棧內存在運行時處理它。

如果我們試圖分配一個B而不是同樣的事情會發生。

+0

非常感謝,我添加了另一個案例。新案件是否有效? – greenhand

0

除非這些對象是靜態的計劃是要吐

java.lang.StackOverflowError 

它可以很容易地通過使變量靜態的,這將導致只有1個實例,無論它是如何調用的次數和管理內存溢出不會

以及如果u想是這樣的工作,你可以做這樣的(但它是不是一個好的做法)

public class B { 
static A a=new A(); 
} 
public class A { 
static B b=new B(); 
} 
public class c { 
public static void main(String[] args) { 
A a=new A(); 
System.out.println("Task completed"+a); 
} 
} 
+0

非常感謝,我添加了另一個案例。新案件是否有效? – greenhand

+0

它不會工作,因爲內存分配仍然是舊的情況下,所以它永遠不會完成分配內存的任何對象在主 – VIPER

相關問題