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
されたときにコンストラクターが呼び出されることが期待されていますが、そうではありません。Demo
main()
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
プログラムに指定された変更を加えないと、コンストラクターにメッセージが表示されないのはなぜですか?