静态数据的初始化
java编程思想中用这段代码来展示静态数据的初始化过程,一开始没看懂,现在来仔细分析一遍吧。
class Bowl{
Bowl(int marker) {
// TODO Auto-generated constructor stub
System.out.println("Bowl("+marker+")");
}
void f1(int marker) {
System.out.println("f1("+marker+")");
}
}
class Tabel{
static Bowl bowl=new Bowl(1);
Tabel() {
System.out.println("Tabel()");
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);
}
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();
table.f2(1);
cupboard.f3(1);
}
static Tabel table=new Tabel();
static Cupboard cupboard=new Cupboard();
}
下面是运行结果
Bowl(1)
Bowl(2)
Tabel()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
分析结果前你要知道的:
(1) 初始化顺序是 先静态对象,而后是非静态对象
(2) 静态初始化只在Class对象首次加载的时候进行一次
(3) 类的内部,变量定义的先后顺序决定了初始化的顺序。变量会在任何方法(包括构造器)被调用之前得到初始化。
程序首先进入main方法,初始化StaticInitialization,StaticInitialization有两个静态域 table,cupboard,随后这两个静态域对应的类也被加载,由于这两个类包含静态对象Bowl对象,所以Bowl也被加载。
初始化Tabel:先初始化bowl1,bowl2 输出 Bowl(1) Bowl(2)
调用构造器Tabel() 输出 Tabel() f1(1)
初始化Cupboard:初始化静态对象 bowl4,bowl5,接着按照顺序初始化第一个非静态对象 bowl3,调用构造器Cupboard() 输出Bowl(4), Bowl(5), Bowl(3), Cupboard(), f1(2)
两个类初始化完毕,进入main
输出 Creating new Cupboard() in main
接着又初始化一遍Cupboard,这一次静态对象不会被初始化(因为静态对象只会初始化一次),其他与上面所说一样,输出 Bowl(3) Cupboard() f1(2)
紧接着又来一遍输出
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
最后调用table,cupboard的f2, f3方法,输出 f2(1) f3(1)