0
public class Run{
 public static void main(String... args){
      A a1 = new A();
 }
}

class A{
  public A(){
    A a = new A();
  }
  //here as well A a = new A();
}

なぜこれは を与えるのjava.lang.StackOverflowErrorですか?ここで再帰呼び出しが発生していますか? それはどのように起こりますか?

4

7 に答える 7

1

コンストラクター内でコンストラクターを呼び出しています。つまりnew、新しいオブジェクトを構築します。

于 2012-07-06T14:22:42.503 に答える
1

ここで再帰呼び出しが発生していますか?

うん

それはどのように起こりますか?

の場合new A()、コンストラクターを呼び出します。これは、コンストラクAターnew A()を呼び出し、new A()... を実行します。それが再帰です。

于 2012-07-06T14:27:16.953 に答える
1

呼び出すことはできますが、無限に実行される再帰呼び出しになります。それがあなたが得た理由ですStackOverflowError

以下は完全に機能します。

public class Run{

 static int x = 1;
 public static void main(String... args){
      A a1 = new A();
 }
}

class A{
   public A(){
     if(x==1){
        A a = new A();
        x++;
    }
  }
}
于 2012-07-06T14:30:38.717 に答える
0

そこには再帰的な呼び出しがあると思います。Aを作成するには、その中に別のAを作成する必要があります。ただし、そのAをその中に作成するには、そのAの中に3番目のAを作成する必要があります。以下同様です。ただし、2つの異なるコンストラクターや引数などを使用する場合は、これを回避できるはずです。

class A {
    public A(boolean spawn){
        if (spawn) {
            A a = new A(false);
        }
    }
}
于 2012-07-06T14:44:48.723 に答える
0

問題は、コンストラクターを呼び出すと、新しいオブジェクトが作成されることです (つまり、コンストラクターを再度呼び出すと、別のオブジェクトが作成されるため、コンストラクターを再度呼び出すことになります...)

これは最高の無限再帰であり、コンストラクターであることとは関係ありません (実際、コンストラクターから新しいオブジェクトを作成できます)。

于 2012-07-06T14:23:51.843 に答える
0

基本的に、コンストラクターはどれも終了しません。それぞれが、タイプの別のオブジェクトをA再帰的にインスタンス化しようとするところまで到達します。

于 2012-07-06T14:29:09.460 に答える
0

実際にオブジェクトを作成するには、コンストラクターを変更する必要がありAます。整数A値のみを保持するとします。この場合、コンストラクタは次のようになります。

class A{
  int number;
  public A(){
      number = 0;
  }
}

コードで行っていることは、実際には独自のコンストラクター内に新しいオブジェクト インスタンスを作成することです。

したがって、 を呼び出すnew A()と、コンストラクターが呼び出され、コンストラクターがnew A()本体内で呼び出されます。自分自身を無限に呼び出すことになるため、スタックがオーバーフローしています。

于 2012-07-06T14:36:55.260 に答える