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プログラムに指定された変更を加えないと、コンストラクターにメッセージが表示されないのはなぜですか?