摘要:先說結(jié)論對于具有繼承關(guān)系的類,它們的類和對象構(gòu)造順序?yàn)楦割惖念悩?gòu)造器子類的類構(gòu)造器父類成員變量的賦值和實(shí)例代碼塊父類的構(gòu)造函數(shù)子類成員變量的賦值和實(shí)例代碼塊子類的構(gòu)造函數(shù)。類實(shí)例塊是放在該類構(gòu)造函數(shù)最前面和父類構(gòu)造函數(shù)之后執(zhí)行的。
先說結(jié)論
對于具有繼承關(guān)系的類,它們的類和對象構(gòu)造順序?yàn)椋焊割惖念悩?gòu)造器() -> 子類的類構(gòu)造器() -> 父類成員變量的賦值和實(shí)例代碼塊 -> 父類的構(gòu)造函數(shù) -> 子類成員變量的賦值和實(shí)例代碼塊 -> 子類的構(gòu)造函數(shù)。
實(shí)驗(yàn)代碼如下:
public class ExtensionTest { public static void main(String[] args) { new SubClass(); } } class SuperClass { { System.out.println("我是父類實(shí)例塊"); } static { System.out.println("我是父類類構(gòu)造塊"); } public SuperClass() { System.out.println("我是父類構(gòu)造函數(shù)塊"); } } class SubClass extends SuperClass { { System.out.println("我是子類實(shí)例塊"); } static { System.out.println("我是子類類構(gòu)造塊"); } public SubClass() { System.out.println("我是子類構(gòu)造函數(shù)塊"); } }
結(jié)果:
我是父類類構(gòu)造塊
我是子類類構(gòu)造塊
我是父類實(shí)例塊
我是父類構(gòu)造函數(shù)塊
我是子類實(shí)例塊
我是子類構(gòu)造函數(shù)塊
解釋:
類構(gòu)造塊是初始化類的時(shí)候執(zhí)行的,而初始化類首先得加載類(不加載類進(jìn)內(nèi)存當(dāng)然沒法初始化)。
類實(shí)例塊是放在該類構(gòu)造函數(shù)最前面和父類構(gòu)造函數(shù)之后執(zhí)行的。因?yàn)樽宇惖臉?gòu)造函數(shù)調(diào)用之前,會先調(diào)用父類的構(gòu)造函數(shù)。
基于上述兩條規(guī)則,我們再來看執(zhí)行順序。
new SubClass()也就是要構(gòu)造SubClass這個(gè)類的一個(gè)對象,而要構(gòu)造這個(gè)對象,首先必須把這個(gè)類的描述、定義加載進(jìn)內(nèi)存(類加載)。因此要先加載這個(gè)類(不過此時(shí)還未初始化)。
加載完這個(gè)類之后,想要構(gòu)造這個(gè)類的對象。但是此時(shí)這個(gè)類的靜態(tài)變量還未被初始化,因此要先初始化這個(gè)類,但是初始化這個(gè)類需要先初始化它的父類,因此此時(shí)就變成了,加載父類->初始化父類(調(diào)用靜態(tài)塊,即類構(gòu)造塊)
->初始化子類(調(diào)用靜態(tài)塊,即類構(gòu)造塊)。
然后就可以構(gòu)造這個(gè)類的對象了,構(gòu)造這個(gè)類的對象之前,要先構(gòu)造父類對象,因此會先調(diào)用父類的構(gòu)造函數(shù),而調(diào)用父類構(gòu)造函數(shù)之前又會先調(diào)用父類的實(shí)例塊。
然后就到了子類構(gòu)造函數(shù),然而執(zhí)行之前一樣要先調(diào)用子類的實(shí)例塊,最后才是子類的構(gòu)造函數(shù)的函數(shù)體。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73403.html
類 在標(biāo)題為面向?qū)ο蟮木幊谈拍钫n程中對面向?qū)ο蟾拍畹慕榻B以自行車課為例,以賽車,山地自行車和雙人自行車為子類,下面是可能實(shí)現(xiàn)Bicycle類的示例代碼,為你提供類聲明的概述,本課程的后續(xù)部分將逐步備份和解釋類聲明,目前,不要關(guān)心細(xì)節(jié)。 public class Bicycle { // the Bicycle class has // three fields ...
摘要:看到的只是,而由泛型附加的類型信息對來說是不可見的。然后再加載執(zhí)行類的靜態(tài)變量以及靜態(tài)語句塊。接口中基本數(shù)據(jù)類型為而抽類象不是的。本地方法接口主要是調(diào)用或?qū)崿F(xiàn)的本地方法及返回結(jié)果。用戶自定義類加載器,在程序運(yùn)行期間,通過的子類動態(tài)加載。 編譯機(jī)制 編譯主要是把?.Java文件轉(zhuǎn)換為 .class 文件。其中轉(zhuǎn)換后的 .class 文件就包含了元數(shù)據(jù),方法信息等一些信息。比如說元數(shù)據(jù)就...
摘要:對象的引用關(guān)鍵字總是指向調(diào)用該方法的對象。根據(jù)出現(xiàn)位置的不同,作為對象的默認(rèn)引用有兩種情形。構(gòu)造器中引用該構(gòu)造器正在初始化的對象。如果同一個(gè)類中包含了兩個(gè)或兩個(gè)以上方法的方法名相同,但形參列表不同,則被稱為方法重載。 類和對象 定義類 面向?qū)ο蟮某绦蛟O(shè)計(jì)過程中有兩個(gè)重要概念:類(class)和對象(object,也被稱為實(shí)例,instance),其中類是某一批對象的抽象,可以把類理解成...
摘要:根據(jù)出現(xiàn)的位置,作為對象的默認(rèn)引用有兩種情形構(gòu)造器中引用該構(gòu)造器正在初始化的對象。在構(gòu)造器中代表該構(gòu)造器正在初始化的對象。用于限定該對象調(diào)用它從父類得到的實(shí)例變量和方法。 子類繼承父類就可以繼承到父類的成員變量和方法。如果訪問控制允許,子類實(shí)例可以直接調(diào)用父類里定義的方法。 如果多個(gè)重載的構(gòu)造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通代碼塊里完成,初始化塊總在構(gòu)...
摘要:面向?qū)ο竺嫦驅(qū)ο蟮娜N基本特征繼承封裝多態(tài)結(jié)構(gòu)化程序設(shè)計(jì)簡介主要原則自頂向下逐步求精模塊化。在面向?qū)ο蠓椒ㄖ校愔g共享屬性和操作的機(jī)制稱為繼承。 面向?qū)ο?面向?qū)ο蟮娜N基本特征:繼承、封裝、多態(tài) 結(jié)構(gòu)化程序設(shè)計(jì)簡介 主要原則:自頂向下、逐步求精、模塊化。 結(jié)構(gòu)化分析SA方法對系統(tǒng)進(jìn)行需求分析;結(jié)構(gòu)化設(shè)計(jì)SD方法對系統(tǒng)進(jìn)行概要設(shè)計(jì)、詳細(xì)設(shè)計(jì);結(jié)構(gòu)化編程SP方法來實(shí)現(xiàn)系統(tǒng)。 結(jié)構(gòu)化程序...
閱讀 3883·2023-04-26 00:36
閱讀 2682·2021-11-16 11:44
閱讀 1107·2021-11-15 17:58
閱讀 1680·2021-09-30 09:47
閱讀 1223·2019-08-30 13:05
閱讀 1554·2019-08-30 12:55
閱讀 2422·2019-08-30 11:02
閱讀 2752·2019-08-29 17:01