ホームページ >Java >&#&チュートリアル >Java でのインスタンス変数の初期化とコンストラクターの実行の正しい実行順序は何ですか?

Java でのインスタンス変数の初期化とコンストラクターの実行の正しい実行順序は何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-29 05:47:10612ブラウズ

What's the Correct Execution Order of Instance Variable Initialization and Constructor Execution in Java?

Java でのインスタンス変数の初期化とコンストラクターの実行

Java オブジェクトの初期化に関するよくある誤解の 1 つは、フィールドとコンストラクターが実行される順序です。 。この概念を例で明確にしましょう。

指定されたコード スニペットでは:

class X {
    Y b = new Y();

    X() {
        System.out.print("X");
    }
}

class Y {
    Y() {
        System.out.print("Y");
    }
}

public class Z extends X {
    Y y = new Y();

    Z() {
        System.out.print("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}

コンストラクターの前にフィールドが初期化されるという前提に反して、このプログラムの出力は "YZX" です。その理由を理解するには、Java の初期化プロセスを詳しく調べる必要があります。

初期化順序:

Java は特定の順序でクラスを初期化します:

  1. 静的メンバー: テキストの静的変数と初期化子order.
  2. コンストラクター呼び出し: スーパー コンストラクター呼び出し (明示的または暗黙的)。
  3. インスタンス変数と初期化ブロック: のフィールドとインスタンス初期化ブロックテキストの順序。
  4. コンストラクター本文: super() 呼び出し後のコンストラクター内の残りのコード。

上記の例では、イベントのシーケンスは次のとおりです。

  • Y のコンストラクターが呼び出されます。 (Y).
  • Z のコンストラクターは X のコンストラクターを呼び出します(YZ).
  • X のコンストラクターが呼び出されます (XYZ)。
  • X のインスタンス変数 b が初期化されます (YZXb)。
  • Z のインスタンス変数 y が初期化されます (YZXby)。

したがって、正しい実行順序は「YZX」です。これは、オブジェクト構築時の予期しない動作を回避するために Java の初期化順序を理解することの重要性を強調しています。

以上がJava でのインスタンス変数の初期化とコンストラクターの実行の正しい実行順序は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。