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创建一个新对象!不完全是递归的理想入门,阿米丽特?不完全是递归的理想入门,阿米丽特?