1

相互に参照する 2 つのクラスがあります。

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();
  }
}

問題のある行を read に変更すると

   B b =new B(this);

それは動作します。2つの行は同じことをしていると思います。一方が機能し、もう一方が機能しないのはなぜですか?

また、最初のバージョンのコンパイラ エラーは読み取ります

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

これは何を意味するのでしょうか?

4

1 に答える 1

13

new A()内部で呼び出すA()と、コンストラクターを呼び出す無限ループが生成されます。これがエラーです。

詳しく説明します。thisコンストラクターに渡すと、現在コンストラクターが内部にあるクラスの新しく構築されたオブジェクトへの参照new B(...)を渡します。新しい を構築する以上のアクションは発生しないため、これで問題ありません。AB

で置き換える場合new A()、最初に class の新しいインスタンスを生成する必要がありますA。これはまだ問題ではありません。問題は、 constructor の内部に入るとA() { ... }、すべてが再び開始されることです。行に到達しB b =new B(new A());、コンストラクターが再度呼び出され、A最終的にこの行に戻って、StackOverflowError.

于 2013-03-08T19:02:55.443 に答える