Class A
{
B b1=new B();
}
Class B
{
A a1=new A();
}
我正在谈论这样的事情吗?有可能吗?
答案 0 :(得分:3)
是的,你可以。以下编译就好了:
class A {
B b1 = new B();
public A() {
System.out.println("A constructor");
}
}
class B {
A a1 = new A();
public B() {
System.out.println("B constructor");
}
}
public class HelloWorld {
public static void main(String []args) {
A a0 = new A();
System.out.println("Done");
}
}
但是,如输出中所示,它通常是一个坏主意:
Exception in thread "main" java.lang.StackOverflowError
at B.<init>(HelloWorld.java:8)
at A.<init>(HelloWorld.java:3)
at B.<init>(HelloWorld.java:8)
at A.<init>(HelloWorld.java:3)
at B.<init>(HelloWorld.java:8)
:
at A.<init>(HelloWorld.java:3)
at B.<init>(HelloWorld.java:8)
at A.<init>(HelloWorld.java:3)
at B.<init>(HelloWorld.java:8)
构建A
尝试创建B
并构建B
尝试创建A
这一事实意味着您将会这样做陷入无限的倒退,最终耗尽了堆栈空间。
你可以安全地让两个对象相互引用,但它通常在构建阶段之后完成,例如:
class A {
B b;
public A() {
System.out.println("A constructor");
}
public void setOther(B bx) {
System.out.println("A linker");
b = bx;
}
}
class B {
A a;
public B() {
System.out.println("B constructor");
}
public void setOther(A ax) {
System.out.println("B linker");
a = ax;
}
}
public class HelloWorld{
public static void main(String []args){
A a0 = new A();
B b0 = new B();
a0.setOther(b0);
b0.setOther(a0);
System.out.println("Done");
}
}
其输出显示:
A constructor
B constructor
A linker
B linker
Done