大家看一下這個例子:
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的對象,恩,對的,是這麼個意思,問題到這裡就差不多解決了。希望能夠對大家起到幫助。