Javaにおけるstatic変数の初期化順序
1853 ワード
Javaにおけるstatic変数の初期化順序
出力結果:
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が来て、一般的な形式で、後のほうが分かりやすいです.
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が来て、一般的な形式で、後のほうが分かりやすいです.