Java类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。如:
class Window {
Window(int marker) {
System.out.println("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we're in the constructor:
System.out.println("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() {
System.out.println("f()");
}
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
}
//输出:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
在 House 类中,故意把几个 Window 对象的定义散布在各处,以证明它们全都会在调用构造器 或其他方法之前得到初始化。此外,w3 在构造器中被再次赋值。 由输出可见,引用 w3 被初始化了两次:一次在调用构造器前,一次在构造器调用期间(第一次引 用的对象将被丢弃,并作为垃圾回收)。这乍一看可能觉得效率不高,但保证了正确的初始化。试想,如 果定义了一个重载构造器,在其中没有初始化 w3,同时在定义 w3 时没有赋予初值,那会产生怎样的 后果呢?