4

Java で次の単純なコードが与えられます。

final class Demo
{
    public static final long serialVersionUID=1L;

    static
    {
        System.out.println("Static constructor invoked.");
    }
}

public final class Main
{
    public static void main(String... args)
    {
        System.out.println(Demo.serialVersionUID);
    }
}

この最も単純な Java コードでは、メソッドを通じてクラスが初期化staticされたときにコンストラクターが呼び出されることが期待されていますが、そうではありませんDemomain()Demo.serialVersionUID

このプログラムを変更せずに実行した場合、出力は1(メッセージ -静的コンストラクターが呼び出されました。ブロックで指定されたstaticとおりに表示されません) のみになります。


メッセージをイニシャライザで指定したとおりに出力したい場合は、クラスstaticの宣言ステートメントを変更する必要があります。Demo

public static final long serialVersionUID=1L;

どちらかに、

public static long serialVersionUID=1L;

final修飾子を削除するか、

public static final Long serialVersionUID=1L;

プリミティブ型longを対応するラッパー型に変更しますLong

では、なぜこのように振る舞うのでしょうか。staticプログラムに指定された変更を加えないと、コンストラクターにメッセージが表示されないのはなぜですか?

4

0 に答える 0