1

我有两个相互引用的类:

class B{
  A obj;
  B(A obj){
    this.obj=obj;
  }
  void display(){
    System.out.println(obj.data);//using data member of A class
  }
}

class A{
  int data=10;

  A(){
   B b =new B(new A());  //  THIS LINE GENERATES AN ERROR
   b.display();
  }
  public static void main(String args[]){
   A a=new A();
  }
}

如果我将违规行改为阅读

   B b =new B(this);

然后它工作。我认为这两条线做同样的事情。为什么一个有效而另一个无效?

此外,第一个版本的编译器错误读取

A.<init><A.java:15>

这是什么意思?

4

1 回答 1

13

通过new A()在内部调用,A()您会产生一个调用构造函数的无限循环。这是错误。

我将更详细地向您解释:当您传入this构造new B(...)函数时,您传递的是对您当前所在构造函数的类的新构造对象的引用A。这没关系,因为除了构造一个新的B.

当您将其替换为 时new A(),您必须首先生成一个新的类实例A。这还不是问题。问题是,当您进入 constructor 时A() { ... },一切都重新开始:您将到达该行B b =new B(new A());并再次调用A构造函数,该构造函数将再次回到该行,直到您收到一个StackOverflowError.

于 2013-03-08T19:02:55.443 回答