Java 解释此代码不起作用的原因
我有两个类相互引用:Java 解释此代码不起作用的原因,java,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.dis
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>
这意味着什么?通过在内部调用新的A,您将生成一个调用构造函数的无限循环。这就是错误所在
我会更详细地向你解释:
当你把这个传给新的B。。。构造函数,您正在传递对类a的新构造对象的引用,您当前在该类的构造函数中。这是可以的,因为除了构造一个新的B之外,它不会导致任何进一步的操作
当您用新的A替换它时,必须首先生成类A的新实例。这还不是问题。问题是,当你进入构造函数A{…}时,一切又开始了:你将到达行B=new Bnew A;并将再次调用A构造函数,该构造函数将再次返回此行,直到您收到StackOverflowerError。通过在A中调用新的A,您将生成一个调用构造函数的无限循环。这就是错误所在
我会更详细地向你解释:
当你把这个传给新的B。。。构造函数,您正在传递对类a的新构造对象的引用,您当前在该类的构造函数中。这是可以的,因为除了构造一个新的B之外,它不会导致任何进一步的操作
当您用新的A替换它时,必须首先生成类A的新实例。这还不是问题。问题是,当你进入构造函数A{…}时,一切又开始了:你将到达行B=new Bnew A;将再次调用A构造函数,该构造函数将再次返回此行,直到收到StackOverflower错误。您的问题是什么?您认为这会导致编译/运行时错误吗?这是有效的代码new总是创建一个新对象,一个对类的新引用,并调用构造函数,在这种情况下,这个循环是无限的,如果您将这个-它引用传递给当前对象。为了简化-新建-创建一个新对象,这不是使用当前objectBest edit ever@Nathaniel创建一个新对象!你的问题到底是什么?您认为这会导致编译/运行时错误吗?这是有效的代码new总是创建一个新对象,一个对类的新引用,并调用构造函数,在这种情况下,这个循环是无限的,如果您将这个-它引用传递给当前对象。为了简化-新建-创建一个新对象,这不是使用当前objectBest edit ever@Nathaniel创建一个新对象!不完全是递归的理想入门,阿米丽特?不完全是递归的理想入门,阿米丽特?