假设有两个A类和B类,是否可以在B中创建A的对象,在A中创建B的对象?

时间:2016-04-12 04:01:13

标签: java eclipse

Class A
{
B b1=new B();
}
Class B
{
A a1=new A();
}
我正在谈论这样的事情吗?有可能吗?

1 个答案:

答案 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