您好,登錄后才能下訂單哦!
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中的構造器初始化的全部內容,希望對大家有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。