我有两个相互引用的类:
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>
这是什么意思?
答案 0 :(得分:13)
通过在new A()
内调用A()
,您会产生一个无限循环来调用构造函数。这是错误。
我会更详细地向您解释:
当您将this
传递给new B(...)
构造函数时,您将引用传递给新构造的类A
对象,该对象的构造函数当前位于其中。这没关系,因为除了构建新的B
之外,它不会引起任何进一步的操作。
当您使用new A()
替换它时,必须先生成类A
的新实例。这还不是问题。问题是,当你进入构造函数A() { ... }
时,一切都会重新开始:你将到达B b =new B(new A());
行并再次调用A
构造函数,这将最终返回到此行再次,直到你收到StackOverflowError
。