Javaにおけるstatic変数の初期化順序

1853 ワード

Javaにおけるstatic変数の初期化順序
package test;


class Bowl { 
	Bowl(int marker) { 
		System.out.println("Bowl(" + marker + ")"); 
	} 
	void f(int marker) { 
		System.out.println("f(" + marker + ")"); 
	} 
} 

class Table { 
	static Bowl b1 = new Bowl(1); 
	Table() { 
		System.out.println("Table()"); 
		b2.f(1); 
	} 
	void f2(int marker) { 
		System.out.println("f2(" + marker + ")"); 
	} 
	static Bowl b2 = new Bowl(2); 
} 

class Cupboard { 
	Bowl b3 = new Bowl(3); 
	static Bowl b4 = new Bowl(4); 
	Cupboard() { 
		System.out.println("Cupboard()"); 
		b4.f(2); 
	} 
	void f3(int marker) { 
		System.out.println("f3(" + marker + ")"); 
	} 
	static Bowl b5 = new Bowl(5); 
} 

public class StaticInitialization { 
	public static void main(String[] args) { 
		System.out.println( 
				"Creating new Cupboard() in main"); 
		new Cupboard(); 
		System.out.println( 
				"Creating new Cupboard() in main"); 
		new Cupboard(); 
		t2.f2(1); 
		t3.f3(1); 
	} 
	static Table t2 = new Table(); 
	static Cupboard t3 = new Cupboard(); 
} ///:~ 

出力結果:
Bowl(1) Bowl(2) Table() f(1) Bowl(4) Bowl(5) Bowl(3) Cupboard() f(2) Creating new Cupboard() in main Bowl(3) Cupboard() f(2) Creating new Cupboard() in main Bowl(3) Cupboard() f(2) f2(1) f3(1)
解析:mainに入ると、2つのstatic変数が発見され、最初のTable型に対して、Tableクラスに入ると、また2つのstaticのBowlクラスが発見されるので、最初の順序はBowl(1)Bowl(2)で、それからTableの構造関数で、Table()を出力する f(1)次はstaticのcupboardクラスであり,cupboardクラスに入ると,2つのstaticのbowlクラスがあることが分かったので,順序はBowl(4)Bowl(5)bowl 3に対してstaticではないので,その順序が後になり,cupboardのコンストラクション関数に入り,Cupboard()を出力する. f(2) 
次は出力文です  またnew cupboardが来ますが、一般形式なのでcupboardクラスに入り、bowl(3)を出力します.これは一般タイプでstaticではなく、Staticタイプでは一度だけ初期化されるからです.次にCupboard()f(2)を出力して出力文を出力します.またnew cupboardが来て、一般的な形式で、後のほうが分かりやすいです.