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" です:
フィールドの初期化 (例: 'b) のため、この出力は予期された順序と矛盾します。 ' および 'y') は、コンストラクター本体 (例: 'X()' および 'y') の実行前に発生します。 'Z()').
Java 仮想マシン仕様 (JVM 仕様) は、次のように初期化の順序を明確にしています:
したがって、提供されたコードでは、インスタンス変数が'b' と 'y' は、'X' と 'Z' のコンストラクター本体が実行される前に初期化され、次の出力が得られます。 「YYXZ」。
以上がJava におけるフィールドの初期化とコンストラクターの実行の実際の順序は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。