ホームページ > Java > &#&チュートリアル > Java におけるフィールドの初期化とコンストラクターの実行の実際の順序は何ですか?

Java におけるフィールドの初期化とコンストラクターの実行の実際の順序は何ですか?

Mary-Kate Olsen
リリース: 2024-12-11 15:00:19
オリジナル
519 人が閲覧しました

What's the Actual Order of Field Initialization and Constructor Execution in Java?

Java コンストラクターでのフィールドの初期化

Java では、フィールドの初期化とコンストラクター コードの実行順序が混乱の話題になっています。提供されているコードは、次の動作を示しています。

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();
    }
}
ログイン後にコピー

コンストラクターがインスタンス変数の前に初期化されるという仮定に基づいて、出力が "XZYY" であると予想される場合があります。ただし、実際の出力は "YYXZ" です:

  • Y(): クラス Y のコンストラクターが呼び出されます。
  • new Y(): クラス X のインスタンス変数 'b' は、次の新しいインスタンスを作成することで初期化されます。 'Y'.
  • X(): クラス X のコンストラクターが呼び出されます。
  • new Y(): インスタンス変数 'y'クラス Z は、の新しいインスタンスを作成することによって初期化されます。 'Y'.
  • Z(): クラス Z のコンストラクターが呼び出されます。

フィールドの初期化 (例: 'b) のため、この出力は予期された順序と矛盾します。 ' および 'y') は、コンストラクター本体 (例: 'X()' および 'y') の実行前に発生します。 'Z()').

Java 仮想マシン仕様 (JVM 仕様) は、次のように初期化の順序を明確にしています:

  1. 静的変数初期化子と静的初期化ブロックが実行されます。
  2. コンストラクター内の super() 呼び出し (存在する場合)。
  3. インスタンス変数初期化子とインスタンス初期化ブロックはテキストの順序で実行されます。
  4. コンストラクターの残りの本体 (super() の後のコードを含む)。

したがって、提供されたコードでは、インスタンス変数が'b' と 'y' は、'X' と 'Z' のコンストラクター本体が実行される前に初期化され、次の出力が得られます。 「YYXZ」。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート