re: 一個(gè)以前沒(méi)有注意的問(wèn)題:java構(gòu)造函數(shù)的執(zhí)行順序
2008-05-27 12:30 |
借用我在
http://www.aygfsteel.com/cheneyfree/archive/2008/05/24/202643.html 里寫(xiě)的回復(fù),再次貼來(lái)這里來(lái),與博主共勉
1. 初始化分為為的初始化和實(shí)例的初始化
2. 每個(gè)類在 JVM 中都對(duì)應(yīng)一個(gè) Class 實(shí)例
3. 父類實(shí)例是作為子例的部分存在的 (Class 實(shí)例之間也存在父子關(guān)系)
4. 初始化實(shí)例之前要初始化類
基于以上幾點(diǎn)就可以理解以下初始化順序
1. 父類靜態(tài)屬性、靜態(tài)類 (父類的初始化,對(duì)應(yīng) JVM 方法 cinit())
2. 子類的靜態(tài)屬性、靜態(tài)類 (子類的初始化,對(duì)應(yīng) JVM 方法 cinit())
3. 父類的實(shí)例構(gòu)造,實(shí)例變量初始化 (實(shí)例變量初始實(shí)際會(huì)放到 JVM 的 init() 中)
4. 子類的實(shí)例構(gòu)造,實(shí)例變量初始化 (也是對(duì)應(yīng)的 init() 方法)
關(guān)于類的 Class 實(shí)例,可以回想 Log 的聲明
Log log = LogFactory.getLog(TestClass.class);
也就是無(wú)論你,new 多少個(gè) TestClass 實(shí)例,它們對(duì)應(yīng)著同一個(gè) TestClass 的 Class 實(shí)例,也就是為什么很多地方把靜態(tài)方法、靜態(tài)屬性說(shuō)成是類的方法、類的屬性,其實(shí)質(zhì)就是在 JVM 中存在同一個(gè) Class 實(shí)例的方法、屬性,也就能保持一致性。
關(guān)于父類實(shí)例是作為子類的一部分存在,可借鑒 C++ 或是有面向?qū)ο筇匦缘?C 函數(shù)庫(kù)(如 gtk),來(lái)理解,父類實(shí)例會(huì)居于子類實(shí)例的首地址,所以對(duì)子類轉(zhuǎn)型成父類實(shí)例時(shí),它是安全的,因?yàn)槭椎刂芬粯拥模詮氖椎刂返?size(父類)就是父類實(shí)例地址空間,到size(子類)就是子類實(shí)例的地址空間。
回復(fù) 更多評(píng)論