大家看一下这个例子:
public class Window {
Window(int marker) {
System.out.println("Window(" + marker + ")");
}
}public class House {
Window w1 = new Window(1);
House() {
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f() {
System.out.println("f()");
}
Window w3 = new Window(3);
}public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f();
}}
想一想会输出什么样的结果?
output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
看到了什么?首先是从main入手,创建一个House对象,然后初始化开始,进入House类中,先初始化谁呢?首先看到了Window类,并创建了一个Window对象,那么是不是要先初始化Window呢?从输出结果来看,似乎是这样的,但接下来的输出结果一起将Window(2)和Window(3)也输出来了,没按套路出牌啊,应该先输出House()啊,怎么Window(2)和Window(3)比House()先输出来了呢?后来又做了个试验:将Window w1 = new Window(1)这段代码移动到了House()构造方法的后面,输出结果如下:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
恩?一样的?恩,是一样的,怎么回事儿呢?再做个试验,再创建一个类Door吧,代码如下:
public class Door {
Door() {
System.out.println("Door()");
}
}public class House {
House() {
System.out.println("House()");
w3 = new Window(33);
}
Window w1 = new Window(1);
Window w2 = new Window(2);
void f() {
System.out.println("f()");
}
Window w3 = new Window(3);
Door door = new Door();
}
看看输出结果:
Window(1)
Window(2)
Window(3)
Door()
House()
Window(33)
f()
看出来大概的意思了吧,不管谁先谁后,只要我House()这个构造函数里面new了对象,那么就先去初始化这些new的对象,恩,对的,是这么个意思,问题到这里就差不多解决了。希望能够对大家起到帮助。