Java 如何创建两个相互引用的对象?

Java 如何创建两个相互引用的对象?,java,Java,在我评论的那行,我得到了一个StackOverflowException。如何解决此问题?如果您希望B对象保存对创建它的a对象的引用,则需要如下内容: class A { B ob1 = new B(); } class B { A ob2 = new A(); } class C { A a = new A(); // I am getting a StackOverflowException here } 这不会导致堆栈溢出,B将知道a,a将知道B。您所

在我评论的那行,我得到了一个
StackOverflowException
。如何解决此问题?

如果您希望B对象保存对创建它的a对象的引用,则需要如下内容:

class A {
    B ob1 = new B();
}

class B {
    A ob2 = new A();
}

class C {
    A a = new A();
   // I am getting a StackOverflowException here 
}

这不会导致堆栈溢出,B将知道a,a将知道B。您所做的是创建a的实例,该实例创建了B的实例,该实例创建了a的实例,该实例创建了…

如果您希望B对象保留对创建它的a对象的引用,你想要这样的东西:

class A {
    B ob1 = new B();
}

class B {
    A ob2 = new A();
}

class C {
    A a = new A();
   // I am getting a StackOverflowException here 
}

这不会导致堆栈溢出,B将知道a,a将知道B。您所做的是创建a的实例,该实例创建了B的实例,该实例创建了a的实例,该实例创建了…

方法的问题是,当您创建
a的实例时,此实例必须创建
B
的实例,该实例还必须创建
A的实例,该实例创建
B
的实例。。。依此类推,直到堆栈溢出


也许最直观的方法是使用getter/setter解决这个问题,比如

class A {
    B ob1 = new B(this);
}

class B {
    A a;

    public B(A a) {
        this.a = a;
    }

}

您的方法的问题是,当您创建
A
的实例时,此实例必须创建
B
的实例,后者也必须创建
A
的实例,后者创建
B
的实例。。。依此类推,直到堆栈溢出


也许最直观的方法是使用getter/setter解决这个问题,比如

class A {
    B ob1 = new B(this);
}

class B {
    A a;

    public B(A a) {
        this.a = a;
    }

}

Java对于Javascript就像汽车对于地毯一样。您不明白错误的哪一部分?你认为你的代码是做什么的?
A
创建了一个新的
B
它创建了一个新的
A
它创建了一个新的
A
它创建了一个新的
B
它创建了一个新的
B
,它创建了一个新的
A
,它创建了一个新的
A
B
创建新的
a
创建新的
B
创建新的
a
创建新的
B
创建新的
a
创建新的
B
a
B
它创建了一个新的
a
它创建了一个新的
B
它创建了一个新的
B
它创建了一个新的
a
它创建了一个新的?你认为你的代码是做什么的?
A
创建了一个新的
B
它创建了一个新的
A
它创建了一个新的
A
它创建了一个新的
B
它创建了一个新的
B
,它创建了一个新的
A
,它创建了一个新的
A
B
创建新的
a
创建新的
B
创建新的
a
创建新的
B
创建新的
a
创建新的
B
a
B
创建一个新的
a
创建一个新的
B
创建一个新的
a
创建一个新的
B
创建一个新的
a
创建一个新的…此建议泄漏构造函数中的
This
。这是非常糟糕的做法。解决这个问题的唯一方法是静态工厂方法。我同意并意识到这一点。但在许多简单的情况下,这不是一个问题吗?不过,我稍后会更新我的答案,所以谢谢。这个建议在构造函数中泄漏了
This
。这是非常糟糕的做法。解决这个问题的唯一方法是静态工厂方法。我同意并意识到这一点。但在许多简单的情况下,这不是一个问题吗?不过,我稍后会更新我的答案,谢谢。我同意:先构建对象,然后再连接它们。这样就不可能得到任何循环引用。这当然是一种有效的方法,解决了问题。我更喜欢工厂模式来封装链接,但这可能只是我的妄想症。@Boristeider我试图避免事情过于复杂,但可以根据工厂模式发布答案。你会得到我的+1。我同意:先构建对象,然后再连接它们。这样就不可能得到任何循环引用。这当然是一种有效的方法,解决了问题。我更喜欢工厂模式来封装链接,但这可能只是我的妄想症。@Boristeider我试图避免事情过于复杂,但可以根据工厂模式发布答案。你会得到我的+1。