java中的静态数据初始化是比较复杂的,看下面的演示程序:
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); //1
static Bowl b2 = new Bowl(2); //2
Table() {
System.out.println("Table()"); //3
b2.f(1); //4
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
}
class Cupboard {
Bowl b3 = new Bowl(3); //7 //11 //15
static Bowl b4 = new Bowl(4); //5
static Bowl b5 = new Bowl(5); //6
Cupboard() {
System.out.println("Cupboard()"); //8 //12 //16
b4.f(2); //9 //13 //17
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
}
public class StaticInitialization {
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main"); //10
new Cupboard();
System.out.println("Creating new Cupboard() in main"); //14
new Cupboard();
t2.f2(1); //18
t3.f3(1); //19
}
}
输出结果为:
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)
注意标注的程序运行顺序
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); //1
static Bowl b2 = new Bowl(2); //2
Table() {
System.out.println("Table()"); //3
b2.f(1); //4
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
}
class Cupboard {
Bowl b3 = new Bowl(3); //7 //11 //15
static Bowl b4 = new Bowl(4); //5
static Bowl b5 = new Bowl(5); //6
Cupboard() {
System.out.println("Cupboard()"); //8 //12 //16
b4.f(2); //9 //13 //17
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
}
public class StaticInitialization {
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main"); //10
new Cupboard();
System.out.println("Creating new Cupboard() in main"); //14
new Cupboard();
t2.f2(1); //18
t3.f3(1); //19
}
}
输出结果为:
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)
注意标注的程序运行顺序