實例解析Java中的構造器初始化
1.初始化順序
當Java創(chuàng)建一個對象時,系統(tǒng)先為該對象的所有實例屬性分配內存(前提是該類已經被加載過了),接著程序開始對這些實例屬性執(zhí)行初始化,其初始化順序是:先執(zhí)行初始化塊或聲明屬性時制定的初始值,再執(zhí)行構造器里制定的初始值。 在類的內部,變量定義的先后順序決定了初始化的順序,即時變量散布于方法定義之間,它們仍就會在任何方法(包括構造器)被調用之前得到初始化。
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.靜態(tài)數據的初始化
無論創(chuàng)建多少個對象,靜態(tài)數據都只占一份存儲區(qū)域。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)
從某種程度上來看,初始化是一段固定執(zhí)行的代碼,它不能接受任何參數。因此初始化塊對同一個類所有對象所進行的初始化處理完全相同?;谶@個原因,不難發(fā)現(xiàn)初始化塊的基本用法,如果有一段初始化處理代碼對所有對象完全相同,且無須接受任何參數,就可以把這段初始化處理代碼提取到初始化塊中。
以上就是本文關于實例解析Java中的構造器初始化的全部內容,希望對大家有所幫助。
相關文章
Java里得到00:00:00格式的時分秒的Timestamp
Java里如何得到00:00:00格式的時分秒的Timestamp ,下面是具體的實現(xiàn)代碼,需要的朋友可以參考下。2009-09-09SpringBoot在IDEA中實現(xiàn)熱部署(JRebel實用版)
這篇文章主要介紹了SpringBoot在IDEA中實現(xiàn)熱部署(JRebel實用版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05Android?Studio中創(chuàng)建java工程的完整步驟
Android?Studio創(chuàng)建java工程是非常麻煩的,因為Android?Studio沒有提供直接創(chuàng)建java工程的方法,下面這篇文章主要給大家介紹了關于Android?Studio中創(chuàng)建java工程的完整步驟,需要的朋友可以參考下2024-01-01mybatis-plus插入一條數據,獲取插入數據自動生成的主鍵問題
這篇文章主要介紹了mybatis-plus插入一條數據,獲取插入數據自動生成的主鍵問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12springboot 在idea中實現(xiàn)熱部署的方法
這篇文章主要介紹了springboot 在idea中實現(xiàn)熱部署的方法,實現(xiàn)了熱部署,在每一次作了修改之后,都會自動的重啟,非常節(jié)約時間,感興趣的小伙伴們可以參考一下2018-10-10