ホームページ > Java > &#&チュートリアル > この Java プログラムが「XZYY」ではなく「YYXZ」を出力するのはなぜですか?

この Java プログラムが「XZYY」ではなく「YYXZ」を出力するのはなぜですか?

Susan Sarandon
リリース: 2024-12-16 19:31:11
オリジナル
837 人が閲覧しました

Why Does This Java Program Output

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」です。この逸脱は、実際の初期化順序を理解することの重要性を強調しています。

Java 仮想マシン仕様によれば、初期化順序は次のとおりです:

  1. 静的変数初期化子と静的初期化ブロック、
  2. コンストラクター内の super() 呼び出し (明示的かどうかに関係なく) implicit.
  3. インスタンス変数初期化子とインスタンス初期化ブロック (テキスト順)。
  4. super() 後のコンストラクターの残りの本体。

この場合、静的変数やブロックは関係ありません。 super() 呼び出しはクラス Z のコンストラクター内で暗黙的に発生するため、コードには表示されません。したがって、初期化順序は次のとおりです。

  1. クラス X のインスタンス変数初期化子 (b)
  2. クラス Y のインスタンス変数初期化子 (y)
  3. クラスのコンストラクター本体X (「X」を出力)
  4. クラス Z のコンストラクター本体 (出力"Z")

これは出力 "YYXZ" を説明します。

以上がこの Java プログラムが「XZYY」ではなく「YYXZ」を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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