QZシェン:
私は、次のコード例があります。
public class example {
// class constructor
public example(){}
public void foo() {
example o = new example();
...
}
}
なぜこれが代わりにつながるのコンパイルおよび実行することができますかStackOverflowError
?
スイーパー:
あなたはこれがにつながると主張していますStackOverflowError
。しかし、StackOverflowError
この方法は、無期限に、直接または間接的に、自分自身を呼び出す場合にのみ発生します。
あなたのケースでは、foo
スタックオーバーフローを実現するために自分自身を呼び出す必要があります。のは、見てみましょうfoo
ありません。
example o = new example();
ときにfoo
呼ばれて、それはのコンストラクタを呼び出すでしょうexample
あなたはここに宣言しました、:
public example(){}
コンストラクタは、返す前に何もしません。今コンストラクタが戻ってきたことを、o
新しく作成されたインスタンスを割り当てられ、foo
それが行うには何もしていないので戻ります。注foo
再び呼び出されていません。
あなたの誤解は、あなたが誤ってコンストラクタが呼び出されたときに、そのクラスのメソッドのすべてとも呼ばれていることを考えていることかもしれません。あなたが実際にコンストラクタのメソッドをコールしない限り、これは、真実ではありません。
public example(){ foo(); } // this will cause stack overflow