1、初始化顺序
- 先静态对象,而后是非静态对象
- 先变量后构造器方法,即使变量定义散布于构造器方法定义之后
- 变量定义的先后顺序决定了初始化的顺序
2、示例代码
class Bowl {
public Bowl(int market) {
System.out.println("Bowl(" + market + ")");
}
public void f(int market) {
System.out.println("f(" + market + ")");
}
}
class Table {
static Bowl b1 = new Bowl(1);
public Table() {
System.out.println("Table()");
b2.f(1);
}
public void f2(int market) {
System.out.println("f2(" + market + ")");
}
static Bowl b2 = new Bowl(2);
}
class CupBoard {
Bowl b3 = new Bowl(3);
static int num = getNum();
static Bowl b4 = new Bowl(num);
public CupBoard() {
System.out.println("CupBoard");
b4.f(2);
}
void f3(int market) {
System.out.println("f3(" + market + ")");
}
static int getNum(){
System.out.println("Static fun: getNum");
return 4;
}
static Bowl b5 = new Bowl(5);
}
public class Init {
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)
Static fun: getNum
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)
3、总结
假设有个名为Dog的类
1)构造器实际上也是静态方法(即使没有显式的使用static),当首次创建类Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件
2)然后载入Dog.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3)当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的储存空间。
4)这块储存空间会被清零,这就自动将Dog对象中的所有基本类型数据都设置成了默认值。
5)执行所有出现于字段定义处的初始化动作。
6)执行构造器。