《Java編程的邏輯》筆記 17 - 繼承實現(xiàn)的基本原理

繼承實現(xiàn)的基本原理.png

例子

  • base類
public class Base {
            public static int s;
            private int a;
            static {
                System.out.println("基類靜態(tài)代碼塊拉背, s: "+s);
                s = 1;
            }
            {
                System.out.println("基類實例代碼塊, a: "+a);
                a = 1;
            }
            public Base(){
                System.out.println("基類構(gòu)造方法, a: "+a);
                a = 2;
            }
            protected void step(){
                System.out.println("base s: " + s +", a: "+a);
            }
            public void action(){
                System.out.println("start");
                step();
                System.out.println("end");
            }
        }
  • 子類
public class Child extends Base {
            public static int s;
            private int a;
            static {
                System.out.println("子類靜態(tài)代碼塊弛随, s: "+s);
                s = 10;
            }
            {
                System.out.println("子類實例代碼塊竣蹦, a: "+a);
                  a = 10;
              }
              public Child(){
                  System.out.println("子類構(gòu)造方法沉御, a: "+a);
                  a = 20;
              }
              protected void step(){
                  System.out.println("child s: " + s +", a: "+a);
              }
          }


  • main方法
public static void main(String[] args) {
            System.out.println("---- new Child()");
            Child c = new Child();
            System.out.println("\n---- c.action()");
            c.action();
            Base b = c;
            System.out.println("\n---- b.action()");
            b.action();
            System.out.println("\n---- b.s: " + b.s);
            System.out.println("\n---- c.s: " + c.s);
        }


  • 輸出結(jié)果

---- new Child()
基類靜態(tài)代碼塊, s: 0
子類靜態(tài)代碼塊, s: 0
基類實例代碼塊, a: 0
基類構(gòu)造方法, a: 1
子類實例代碼塊, a: 0
子類構(gòu)造方法, a: 10

---- c.action()
start
child s: 10, a: 20
end

---- b.action()
start
child s: 10, a: 20
end

---- b.s: 1

---- c.s: 10

類的加載

  • 一個類的主要信息
    (1)類變量(靜態(tài)變量)
    (2)類初始化代碼

定義靜態(tài)變量時的賦值語句
靜態(tài)初始化代碼塊
先執(zhí)行父類的昵观,再執(zhí)行子類的
父類執(zhí)行時碳抄,子類靜態(tài)變量的值也是有的愉老, 是默認(rèn)值。對于默認(rèn)值剖效,我們之前說過嫉入, 數(shù)字型變量都是0,boolean是false璧尸, char是'\u0000'咒林,引用型變量是null。

(3)類方法(靜態(tài)方法)
(4) 實例變量
(5)實例初始化代碼

定義實例變量時的賦值語句
實例初始化代碼塊
構(gòu)造方法

(6)實例方法
(7)父類信息引用

  • 類加載過程包括:
    (1)分配內(nèi)存保存類的信息
    (2)給類變量賦默認(rèn)值
    (3)加載父類
    (4)設(shè)置父子關(guān)系
    (5)執(zhí)行類初始化代碼

內(nèi)存

(1)棧存放函數(shù)的局部變量
(2)堆存放動態(tài)分配的對象
(3)方法區(qū)放類的信息
(4)例子加載后內(nèi)存示意圖


image.png

對象創(chuàng)建的過程

new Child()就是創(chuàng)建Child對象
(1)分配內(nèi)存
(2)對所有實例變量賦默認(rèn)值
(3)執(zhí)行實例初始化代碼
分配的內(nèi)存包括本類和所有父類的實例變量爷光,但不包括任何靜態(tài)變量垫竞。實例初始化代碼的執(zhí)行從父類開始,先執(zhí)行父類的蛀序,再執(zhí)行子類的欢瞪。但在任何類執(zhí)行初始化代碼之前,所有實例變量都已設(shè)置完默認(rèn)值
每個對象除了保存類的實例變量之外徐裸,還保存著實際類信息的引用遣鼓。
Child c = new Child();會將新創(chuàng)建的Child對象引用賦給變量c,而Base b = c;會讓b也引用這個Child對象
創(chuàng)建和賦值后重贺,內(nèi)存布局


image.png

方法調(diào)用

  • c.action()代碼的執(zhí)行過程
    (1)查看c的對象類型骑祟,找到Child類型,在Child類型中找action方法气笙,發(fā)現(xiàn)沒有次企,到父類中尋找
    (2)在父類Base中找到了方法action,開始執(zhí)行action方法
    (3)action先輸出了start潜圃,然后發(fā)現(xiàn)需要調(diào)用step()方法缸棵,就從Child類型開始尋找step方法
    (4)在Child類型中找到了step()方法,執(zhí)行Child中的step()方法谭期,執(zhí)行完后返回action方法
    (5)繼續(xù)執(zhí)行action方法蛉谜,輸出end
    尋找要執(zhí)行的實例方法的時候,是從對象的實際類型信息開始查找的崇堵,找不到的時候型诚,再查找父類類型信息。
  • b.action()
    這句代碼的輸出和c.action是一樣的鸳劳,這稱之為動態(tài)綁定狰贯, 而動態(tài)綁定實現(xiàn)的機制,就是根據(jù)對象的實際類型查找要執(zhí)行的方法, 子類型中找不到的時候再查找父類涵紊。這里傍妒,因為b和c指向相同的對象, 所以執(zhí)行結(jié)果是一樣的摸柄。
  • 虛方法表
    所謂虛方法表颤练,就是在類加載的時候,為每個類創(chuàng)建一個表驱负, 這個表包括該類的對象所有動態(tài)綁定的方法及其地址嗦玖, 包括父類的方法,但一個方法只有一條記錄跃脊, 子類重寫了父類方法后只會保留子類的宇挫。
image.png

對Child類型來說,action方法指向Base中的代碼酪术,toString方法指向Object中的代碼器瘪,而step()指向本類中的代碼。
這個表在類加載的時候生成绘雁,當(dāng)通過對象動態(tài)綁定方法的時候橡疼,只需要查找這個表就可以了,而不需要挨個查找每個父類庐舟。

  • 變量訪問
    對變量的訪問是靜態(tài)綁定的欣除,無論是類變量還是實例變量。代碼中演示的是類變量:b.s和c.s继阻,通過對象訪問類變量,系統(tǒng)會轉(zhuǎn)換為直接訪問類變量Base.s和Child.s废酷。
    例子中的實例變量都是private的瘟檩,不能直接訪問,如果是public的澈蟆,則b.a訪問的是對象中Base類定義的實例變量a墨辛,而c.a訪問的是對象中Child類定義的實例變量a。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴俘,一起剝皮案震驚了整個濱河市睹簇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寥闪,老刑警劉巖太惠,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疲憋,居然都是意外死亡凿渊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃脏,“玉大人搪锣,你說我怎么就攤上這事〔势” “怎么了构舟?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堵幽。 經(jīng)常有香客問我狗超,道長,這世上最難降的妖魔是什么谐檀? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任抡谐,我火速辦了婚禮,結(jié)果婚禮上桐猬,老公的妹妹穿的比我還像新娘麦撵。我一直安慰自己,他們只是感情好溃肪,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布免胃。 她就那樣靜靜地躺著,像睡著了一般惫撰。 火紅的嫁衣襯著肌膚如雪羔沙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天厨钻,我揣著相機與錄音扼雏,去河邊找鬼。 笑死夯膀,一個胖子當(dāng)著我的面吹牛诗充,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诱建,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蝴蜓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俺猿?” 一聲冷哼從身側(cè)響起茎匠,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎押袍,沒想到半個月后诵冒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡谊惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年造烁,在試婚紗的時候發(fā)現(xiàn)自己被綠了否过。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡惭蟋,死狀恐怖苗桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情告组,我是刑警寧澤煤伟,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站木缝,受9級特大地震影響便锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜我碟,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一放案、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矫俺,春花似錦吱殉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铅匹,卻和暖如春押赊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背包斑。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工流礁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罗丰。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓神帅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丸卷。 傳聞我的和親對象是個殘疾皇子枕稀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一询刹、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,754評論 0 10
  • 整理來自互聯(lián)網(wǎng) 1谜嫉,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境凹联,java的開發(fā)工具...
    Ncompass閱讀 1,540評論 0 6
  • 一:java概述: 1沐兰,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境蔽挠,java的開發(fā)...
    慕容小偉閱讀 1,796評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,113評論 1 32
  • 一:java概述:1住闯,JDK:Java Development Kit瓜浸,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,662評論 0 11