大家看一下這個例子:
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()構造方法的後面,輸出結果如下:
恩?一樣的?恩,是一樣的,怎麼回事兒呢?再做個試驗,再建立一個類Door吧,代碼如下:
public class Door { Door() { System.out.println("Door()"); public class House { Door door = new Door();
看看輸出結果:
Door()
看出來大概的意思了吧,不管誰先誰後,隻要我House()這個構造函數裡面new了對象,那麼就先去初始化這些new的對象,恩,對的,是這麼個意思,問題到這裡就差不多解決了。希望能夠對大家起到幫助。