2016-06-26 12 views
-3

Ich sehe viele Beispiele, die eine oder viele Beziehungen in JAVA darstellen. Aber ich verstehe immer noch nicht, warum das funktioniert.Warum können zwei Klassen in JAVA aufeinander verweisen?

wenn ich:

Klasse A() {B b = new B();}

Klasse B() {A a = new A();}

wenn ich ein A in der Hauptmethode als Startpunkt neu anlege, wie JAVA Speicher zuordnet, um diesen Fall zu behandeln? Wäre die Speicherzuweisung nicht endlos? A hat b, dann b hat eine andere A dann go on forever

vielen Dank

weitere Frage:

kann ich so etwas wie dies statt?

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

Klasse B() {A a; public void setA (A aa) {}}

Vielen Dank

+1

Hast du versucht, ein 'A' zuzuordnen?Ich schlage vor, Sie tun das, und ich denke, Sie werden Ihre Antwort finden. –

+0

Wenn es eine Eins-zu-Eins-Beziehung ist, hat A ein B, das dasselbe A hat, also keine unendliche Speicherzuweisung. –

+0

@YassinHajaj Nein, ist es nicht. –

Antwort

3

Java diese Situation nicht umgehen kann ; wenn wir den Code und weisen eine Instanz von A korrigieren (und machen diese Klassen static so können wir es in einem einfachen MCVE einbetten) wir so etwas wie

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

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

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

sehen, die, wenn sie ausgeführt werden, wirft

Exception in thread "main" java.lang.StackOverflowError 

Bei kompilieren Zeit, behandelt es zur Laufzeit durch erschöpfende Stapelspeicher.

Das Gleiche würde passieren, wenn wir stattdessen ein B zuzuweisen versucht.

+0

Vielen Dank, ich füge einen weiteren Fall hinzu. Funktioniert der neue Fall? – greenhand

0

Es sei denn, diese Objekte statisch sind das Programm gonna throw

java.lang.StackOverflowError 

kann es leicht statisch, indem Variablen verwaltet werden, die unabhängig von nur 1 Instanz führen wird, wie oft sie aufgerufen wird und die Speicher wird nicht Überlauf

gut, wenn u so etwas wollen Sie arbeiten kann es wie folgt tun (Aber es ist keine gute Praxis)

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

Vielen Dank, ich füge einen anderen Fall hinzu. Funktioniert der neue Fall? – greenhand

+0

wird es auch nicht funktionieren, da die Speicherzuordnung immer noch der gleiche alte Fall ist, so dass es die Schleife zum Zuweisen von Speicher für jedes in main deklarierte Objekt niemals beenden wird – VIPER

Verwandte Themen