なぜそれが宣言し、この方法では、そのクラスのオブジェクトを初期化するためのJavaクラスの対象ですか?

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=233358&siteId=1