「こんにちは、アミーゴ! リシが何か新しくて刺激的なことを説明してくれたと聞きました?!」

「その通りです、キムさん」

「私のトピックも同様に興味深いものになります。クラスがどのようにメモリにロードされるかについてお話したいと思います。」

Java のクラスは、コンパイルされた Java コードであるバイトコードを含むディスク上のファイルです。

"はい。覚えています。"

Java マシンは、必要がない場合にはそれらをロードしません。コード内のどこかでクラスへの呼び出しがあるとすぐに、Java マシンはそのクラスがロードされているかどうかを確認します。そうでない場合は、ロードして初期化します。

クラスの初期化には、そのすべての静的変数に値を割り当て、すべての静的初期化ブロックを呼び出すことが含まれます。

「それは、オブジェクトのコンストラクターを呼び出すのと似ているように思えます。しかし、静的初期化ブロックとは何ですか?」

「オブジェクトを初期化するために複雑なコード (たとえば、ファイルから何かをロードする) を実行する必要がある場合は、コンストラクターで実行できます。ただし、静的変数にはそのような機会がありません。しかし、必要性は依然として残っているため、次のように実行できます。静的初期化ブロックをクラスに追加します。それらは基本的に静的コンストラクターと同等です。」

見た目はこんな感じです。

コード 本当に何が起こるのか
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}
class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Static constructors aren't allowed in Java,
//but if they were, everything
//would look like this
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

これは、コンストラクターが呼び出されたときに起こることとよく似ています。(存在しない) 静的コンストラクターとしてそれを書いたこともあります。

"うん、分かった。"

"とても良い。"