這篇文章主要透過實例解析Java中的構造器初始化,程式碼很簡單,敘述很明確,需要的朋友可以了解下。
1.初始化順序
當Java建立一個物件時,系統先為該物件的所有實例屬性指派記憶體(前提是該類別已經載入過了),接著程式開始對這些實例屬性執行初始化,其初始化順序為:先執行初始化區塊或宣告屬性時所製定的初始值,再執行構造器裡制定的初始值。 在類別的內部,變數定義的先後順序決定了初始化的順序,即時變數散佈於方法定義之間,它們仍就會在任何方法(包括建構器)被呼叫之前初始化。
class Window { Window(int maker) { System.out.println("Window(" + maker + ")"); } } class House { Window window1 = new Window(1); House() { System.out.println("House()"); w3 = new Window(33); } Window window2 = 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(); } }
運行結果:
Window(1) Window(2) Window(3) House() Window(33) f()
由輸出可見,w3這個引用會被初始化兩次:一次在在呼叫建構器之前,一次在呼叫期間(第一次引用的物件將被丟棄,並作為垃圾回收)。
2.靜態資料的初始化
無論創建多少個對象,靜態資料都只佔一份儲存區域。 static關鍵字不能應用於局部變量,因此它只能作用於域。
class Bowl { Bowl(int maker) { System.out.println("Bowl(" + maker + ")"); } void f1(int maker) { System.out.println("f1(" + maker + ")"); } } class Table { static Bowl bowl1 = new Bowl(1); Table() { System.out.println("Table()"); bowl2.f1(1); } void f2(int maker) { System.out.println("f2(" + maker + ")"); } static Bowl bowl2 = new Bowl(2); } class Cupboard { Bowl bowl3 = new Bowl(3); static Bowl bowl4 = new Bowl(4); Cupboard() { System.out.println("CupBoard()"); bowl4.f1(2); } void f3(int maker) { System.out.println("f3(" + maker + ")"); } static Bowl bowl5 = new Bowl(5); } public class StaticInitialization { public static void main(String[] args) { System.out.println("created new Cupboard() in main"); new Cupboard(); System.out.println("created new Cupboard in main"); new Cupboard(); table.f2(1); cupboard.f3(1); } static Table table = new Table(); static Cupboard cupboard = new Cupboard(); }
運行結果:
Bowl(1) Bowl(2) Table() f1(1) Bowl(4) Bowl(5) Bowl(3) CupBoard() f1(2) created new Cupboard() in main Bowl(3) CupBoard() f1(2) created new Cupboard in main Bowl(3) CupBoard() f1(2) f2(1) f3(1)
從某種程度上來看,初始化是一段固定執行的程式碼,它不能接受任何參數。因此初始化區塊對同一個類別所有物件所進行的初始化處理完全相同。基於這個原因,不難發現初始化區塊的基本用法,如果有一段初始化處理程式碼對所有物件完全相同,且無須接受任何參數,就可以把這段初始化處理程式碼提取到初始化區塊中。
以上是Java中構造器初始化的範例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!