1.在调用构造初始化之前,会首先对成员变量进行自动初始化。
public class Counter {
int i;
Counter() {
i = 7 ;
}
}
i的值首先会被置为0,然后才是调用构造器,使得i变成7。
2.成员变量的初始化顺序为定义的先后顺序。
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 );
}
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 Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
输出结果为:
输出结果:
Bowl(1)
Bowl(2)
Table()
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)
结果分析:
在main函数执行之前,完成static的初始化
执行static Table table = new Table ();
在Table中,又首先初始化两个static
得到结果:
Bowl(1)
Bowl(2)
执行Table的构造函数
得到结果:
Table()
f1(1)
然后执行static Cupboard cupboard = new Cupboard();
进入Cupboard,还是首先对static变量初始化
得到结果
Bowl(4)
Bowl(5)
然后对Cupboard的成员变量进行初始化
执行Bowl bowl3 = new Bowl( 3);
得到结果
Bowl(3)
然后执行Cupboard的构造函数
得到结果
Cupboard()
f1(2)
至此,StaticInitialization类中的两个static变量执行完毕。
然后开始执行main函数
首先得到
Creating new Cupboard() in main
再执行new Cupboard();
要注意到,static成员不属于对象,从属于类,只进行一次初始化
这时static不执行,开始对成员变量bowl3初始化
得到结果
Bowl(3)
再执行Cupboard的构造函数
得到结果
Cupboard()
f1(2)
之后执行结果类似。