4

次のコードがあるとします。

 public class Classa {

     int x=10;

     void func(){

     }

     Classa inner=new Classa(){
         void func(){
                 x=90;
         }

     };

     public static void main(String[] args) {
         Classa c=new Classa();
         c.inner.func();

     }
 }

インスタンス化中にアプリがクラッシュするのはなぜですか? (デバッガによると)ある種の無限再帰に入ります。何か案が?

4

5 に答える 5

3

あなたが持っているので

Classa inner=new Classa()

これはと同等です

class Classa {
  Classa inner;

  Classa() {
    inner = new Classa();
  }
}

含まれているクラスと同じ型の内部変数をインスタンス化し続けるため、無限の量のインスタンスが作成されます。

インスタンスを初期化するには、タイプClassaの内部変数を割り当てる必要がありますClassa。ここでは無限再帰です。

于 2013-05-06T19:57:22.937 に答える
2

new Classa() を呼び出しています。これにより、クラスの構築がトリガーされます。

inner変数はどのようにインスタンス化されるのでしょうか。コンストラクター呼び出しで、再帰的に呼び出しますinner = new Classa()

では、その呼び出しから何が起こるのでしょうか? スタックオーバーフローが発生するまで、プロセスが再帰的に繰り返されます

于 2013-05-06T19:57:32.767 に答える
1

新しいオブジェクトを構築しようとしている間、構築プロセスの一部としてClassaインスタンス変数が初期化され、コンストラクターへの別の呼び出しが発生するため、コードは無限の再帰に入ります。innerClassa

于 2013-05-06T19:57:17.707 に答える
1

innerクラスで定義されているインスタンス変数があります。の匿名サブクラスに初期化していますClassa。これにより、 の別のインスタンスが作成されますClassa。しかし、その新しいインスタンスは独自の を作成しようとするためinner、 のインスタンスを作成する呼び出しの無限ループが発生しますClassa。各呼び出しはスタックに物を置き、最終的にはStackOverflowError結果になります。

それを止める 1 つの方法は makeであるため、クラス全体に対してinner static1 つしかありません。inner

static Classa inner = new Classa(){
于 2013-05-06T19:57:24.390 に答える
1

new Classa()Classa コンストラクター内から呼び出しています。

于 2013-05-06T19:56:41.590 に答える