解释为什么这段代码不起作用

时间:2013-03-08 19:01:15

标签: java

我有两个相互引用的类:

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>

这是什么意思?

1 个答案:

答案 0 :(得分:13)

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

我会更详细地向您解释: 当您将this传递给new B(...)构造函数时,您将引用传递给新构造的类A对象,该对象的构造函数当前位于其中。这没关系,因为除了构建新的B之外,它不会引起任何进一步的操作。

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