2016-06-28 8 views
0

以下のコードを使用すると、stackoverflow例外が発生します。 16行目(つまりpublic my my = new my())が繰り返し呼び出されているようです。誰かがそれを継続的に呼び出す理由を説明してもらえますか?匿名クラスのコンストラクタが連続的にループする

abstract class my { 
static int i = 0; 
my(){ 

    System.out.println("my constructor " + i++); 
} 
public void mymethod() { 
    System.out.println("Abstract"); 
} 


public my m1 = new my() { 

    public void mymethod() { 
     System.out.println("Inside Abstract"); 
    } 
}; 
+2

にコンパイルされます。これは、あなたの問題をすぐに、速やかにSOよりも速く表示します。デバッガの使い方がわからない場合は、表示されるスタックトレースを読むだけで済みます。 –

答えて

1

あなたはnew myを呼び出して初期化し、インスタンスフィールド、m1を、持っています。インスタンスフィールドの初期化は、構築中に行われます。 インスタンスを構築し、そのインスタンスを構築するには別のインスタンスを構築してm1に割り当てる必要があります。そのインスタンスを構築するには、に割り当てるインスタンスを構築する必要があります。m1; を作成するは別のインスタンスを作成する必要があります。

あなたはそのアイデアを得ます。

Peter saidとして、何かがどのように動作しているのかを理解する最良の方法は、デバッガを使用してコードをステップ実行することです。デバッガを使用することは高度な技術ではなく、言語学習の初期段階で学ぶための基本的なツールです。


は実際には、コンパイラは、インスタンス初期化子コードを受け取り、クラス内のすべてのコンストラクタの先頭に挿入します。だから、

class Foo { 
    private int bar = 42; 

    Foo() { 
     System.out.println("no args"); 
    } 

    Foo(int arg) { 
     System.out.println("one arg: " + arg); 
    } 
} 

は、実際に私はあなたのデバッガでコードをステップ実行されてみてください最初にすることを示唆して

class Foo { 
    private int bar; 

    Foo() { 
     bar = 42 
     System.out.println("no args"); 
    } 

    Foo(int arg) { 
     bar = 42 
     System.out.println("one arg: " + arg); 
    } 
} 
+0

お返事ありがとうございました。しかし、私の理解を助けてくれました。 – vrreddy1234

関連する問題