package d0310;
public class StaticInit {
public static void main(String[] args) {
System.out.println("Cteating new Cupboard(1) in main");
new Cupboard();
System.out.println("***************************");
System.out.println("Cteating new Cupboard(2) in main");
new Cupboard();
System.out.println("***************************");
table.f2(1);
System.out.println("***************************");
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
class Bowl {
Bowl(int marker){
System.out.println("Bowl("+marker+")");
}
void f1(int marker){
System.out.println("f1("+marker+")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard (){
System.out.println("Cupboard ()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl bowl5 = new Bowl(5);
}
运行结果:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard ()
f1(2)
Cteating new Cupboard(1) in main
Bowl(3)
Cupboard ()
f1(2)
***************************
Cteating new Cupboard(2) in main
Bowl(3)
Cupboard ()
f1(2)
***************************
f2(1)
***************************
f3(1)
分析:
核心:加载类时,首先加载静态
>>
首先加载
static Table table = new Table(); 在Table中加载静态 static Bowl bowl1 = new Bowl(1); 在Bowl调用构造方法,打印Bowl(1); static Bowl bowl2 = new Bowl(2);
在Bowl调用构造方法,打印Bowl(2); 退出Bowl; 开始加载Table的构造方法 打印Table()
调用bowl.f1(1)打印f1(1)
退出Table
static Cupboard cupboard = new Cupboard();static Bowl bowl4 = new Bowl(4);打印Bowl(4)在Cupboard中加载静态
static Bowl bowl5 = new Bowl(5);打印Bowl(5)在Cupboard中加载 Bowl bowl3 = new Bowl(3);打印Bowl(3)
退出Cupboard开始加载Cupboard的构造方法 打印Cupboard() f1(2)
开始打印Cteating new Cupboard(1) in main
执行new Cupboard();
打印Cupboard() f1(2)
在Cupboard中加载 Bowl bowl3 = new Bowl(3);打印Bowl(3)
加载Cupboard的构造方法 打印Cupboard() f1(2) 后来就比较常规···