變數初始化順序
阿新 • • 發佈:2019-01-10
在一個類裡,初始化的順序是由變數在類內的定義順序決定的。即使變數定義大量遍佈於方法定義的中間,那些變數仍會在呼叫任何方法之前得到初始化——甚至在構建器呼叫之前。例如:
在Card中,Tag物件的定義故意到處散佈,以證明它們全都會在構建器進入或者發生其他任何事情之前得到初始化。除此之外,t3在構建器內部得到了重新初始化。它的輸入結果如下:
因此,t3控制代碼會被初始化兩次,一次在構建器呼叫前,一次在呼叫期間(第一個物件會被丟棄,所以它後來可被當作垃圾收掉)。從表面看,這樣做似乎效率低下,但它能保證正確的初始化——若定義了一個過載的構建器,它沒有初始化t3;
//: OrderOfInitialization.java // Demonstrates initialization order. // When the constructor is called, to create a // Tag object, you'll see a message: class Tag { Tag(int marker) { System.out.println("Tag(" + marker + ")"); } } class Card { Tag t1 = new Tag(1); // Before constructor Card() { // Indicate we're in the constructor:System.out.println("Card()"); t3 = new Tag(33); // Re-initialize t3 } Tag t2 = new Tag(2); // After constructor void f() { System.out.println("f()"); } Tag t3 = new Tag(3); // At end } public class OrderOfInitialization { public static void main(String[] args) { Card t = new Card(); t.f(); // Shows that construction is done} } ///:~
在Card中,Tag物件的定義故意到處散佈,以證明它們全都會在構建器進入或者發生其他任何事情之前得到初始化。除此之外,t3在構建器內部得到了重新初始化。它的輸入結果如下:
Tag(1) Tag(2) Tag(3) Card() Tag(33) f()
因此,t3控制代碼會被初始化兩次,一次在構建器呼叫前,一次在呼叫期間(第一個物件會被丟棄,所以它後來可被當作垃圾收掉)。從表面看,這樣做似乎效率低下,但它能保證正確的初始化——若定義了一個過載的構建器,它沒有初始化t3;