https://docs.oracle.com/en/java/ に公開されているJavaチュートリアルの「フィールドの初期化」https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html のところで質問が多かった「Static Initialization Blocks(静的初期化ブロック )」についての簡単なメモ。(細かい解説は、気が向いたら書くかも)
ざっくりと説明
static { .... }
を使ってブロックを書いて、そこにstaticフィールドの初期化を入れることができる。これがStatic Initialization Blocksというもの。
Static Initialization Blockは、コンストラクタより前に実行されるブロックである。
Static Initialization Blockは、そのクラスを宣言で利用しただけのときは、まだ実行されない。
Static Initialization Blockは、そのクラスのコンストラクタまたはstaticメソッドを呼び出したときに、先駆けて実行される。
staticの付いていない{ .... }
は、インスタンスフィールドの初期化のためのブロック(Initialization Blocks)になる。これも、実行はコンストラクタより前。
Initialization Blocksにあるロジックは、どのコンストラクタからも呼び出されるので、コンストラクタのオーバーロードがある場合で、どのコンストラクタでも同じように行うロジックを入れておくことができる。
動作確認したければ、以下のソースで。
public class InitializationBlocksSample {
final static int x;
int y;
// Static Initialization Blocks, it is called before first load.
static {
x=10;
System.out.println("Static Initialization Blocks");
}
// Initialization Blocks, it it called from all constructors.
{
y=10;
System.out.println("Initialization Blocks");
}
// constructor
public InitializationBlocksSample() {
System.out.println("non-parameter constructor");
}
public InitializationBlocksSample(String param) {
System.out.println("parameter constructor");
}
public static void staticMethod() {
System.out.println("staticMethod");
}
public void instanceMethod() {
System.out.println("instanceMethod");
}
}
public class Main {
public static void main(String[] args) {
InitializationBlocksSample o;
System.out.println("start");
InitializationBlocksSample.staticMethod();
o = new InitializationBlocksSample();
o.instanceMethod();
InitializationBlocksSample p = new InitializationBlocksSample("parameter");
}
}
static関連の記事:Javaのstaticな話