Java(5):面向?qū)ο笏拇蠡咎匦?繼承


前言

關(guān)于繼承的概念,我就不在這里就多啰嗦,用一句話來(lái)說(shuō)就是,子承父業(yè),子類是父類的超集.

在Objective-C中,我們想要繼承一個(gè)我們想讓某個(gè)類繼承與某個(gè)基類,我們需要在這個(gè)類的.h文件中這個(gè)類名后面加上 :基類 這樣就表示當(dāng)前類繼承于某個(gè)基類,如下代碼所示,Object就是繼承于NSObject.

#import <Foundation/Foundation.h>

@interface Object : NSObject

@end

</br>

Java中的繼承

在Java中的繼承是需要使用關(guān)鍵詞 extends 來(lái)表示繼承關(guān)系的.比如有Student和People兩個(gè)類,我們想讓Student類繼承于People類.我們可以如下書寫代碼.

public class Student extends People {

}

如果一個(gè)類沒(méi)有寫繼承于哪個(gè)基類的話,那么這個(gè)類隱式地從Java的標(biāo)志根類Object進(jìn)行了繼承.如下所示,當(dāng)我們創(chuàng)建一個(gè)類的時(shí)候,系統(tǒng)會(huì)在繼承基類這一項(xiàng)中默認(rèn)的填寫上繼承于Java的標(biāo)志根類Object.

在子類中我們可以訪問(wèn)到父類中的各種方法以及屬性,當(dāng)然我們需要根據(jù)屬性和方法的修飾詞了來(lái)決定了我們是否具有訪問(wèn)權(quán)限了.這里就不過(guò)多啰嗦了.


初始化基類

Think in Java(Java編程思想)這本書中第7章復(fù)用類中對(duì)初始化基類有這樣的一段解釋.

從外部看來(lái),派生類是一個(gè)與基類具有相同接口的新類,或許還會(huì)有一些額外的的方法和域 。但繼承并不僅僅是類的復(fù)用。當(dāng)創(chuàng)建了一個(gè)派生類的對(duì)象時(shí),該類包含了一個(gè)基類的子對(duì)象。這個(gè)子對(duì)象和你用基類直接創(chuàng)建的對(duì)象沒(méi)有什么兩樣。二者的區(qū)別在于,后者來(lái)自于外部,而基類的子對(duì)象來(lái)自于派生類對(duì)象的內(nèi)部。對(duì)基類的子對(duì)象初始化時(shí)至關(guān)重要的,而且也只有一種方法來(lái)保證這一點(diǎn),那就是在派生類的構(gòu)造器中調(diào)用基類的構(gòu)造器,而基類的構(gòu)造器具有執(zhí)行基類初始化所需的所有能力和知識(shí)。

子類與父類的關(guān)系.png

上面一段文字和圖片如果看起來(lái)仍然很抽象的話,下面我們就接著Student和People兩個(gè)類來(lái)進(jìn)行說(shuō)明.Student是繼承于People這個(gè)類的,我們?cè)赑eople類中重寫People的構(gòu)造器方法,讓它打印一句話.如下所示.

public class People {

    public People() {
        System.out.println("父類方法");
    }   
}

然后我們?cè)谌我獾囊粋€(gè)位置創(chuàng)建一個(gè)Student對(duì)象.在控制臺(tái)會(huì)打印出如下的信息.

這樣我們就上面例子中得到一個(gè)結(jié)論,派生類構(gòu)建過(guò)程是從基類"向外"擴(kuò)散的,所有基類在派生類構(gòu)造器可以訪問(wèn)它之前,就已經(jīng)完成了初始化,即使不為派生類創(chuàng)建構(gòu)造器,編譯器也會(huì)為你合成一個(gè)默認(rèn)的構(gòu)造器,改構(gòu)造器將會(huì)調(diào)用基類的構(gòu)造器.

假定,我們?cè)赑eople類中重構(gòu)了一個(gè)帶有參數(shù)的構(gòu)造器方法,如下所示.

public class People {
    
    public People(int i) {
        System.out.println("父類參數(shù)方法"+i);
    }
}

我們想讓創(chuàng)建Student對(duì)象的時(shí)候調(diào)用這個(gè)這個(gè)帶有參數(shù)的構(gòu)造器方法,這種情況,我們?cè)撊绾翁幚砟?這時(shí)候我們就需要使用Java中的另一個(gè)關(guān)鍵字super,使用super來(lái)顯式的編寫調(diào)用基類構(gòu)造器的方法.這樣就能完成我們的需求了.

public class Student extends People {

    public Student() {
        super(1);
    }
}

這時(shí)候我們?cè)僭谌我獾囊粋€(gè)位置創(chuàng)建一個(gè)Student對(duì)象.運(yùn)行程序,在控制臺(tái)則會(huì)打印出如下的信息.

這里對(duì)super關(guān)鍵字多說(shuō)兩句,我們使用super關(guān)鍵字不但可以直接訪問(wèn)構(gòu)造器方法,我們也可以使用super*調(diào)用具有訪問(wèn)權(quán)限的方法和屬性,這樣我們就可以拿到基類的屬性和方法了.我們假定在People類中有一個(gè)屬性叫做peopleName,我們?cè)趐eopleName初始化的時(shí)候給它賦值,如下所示.

    public String peopleName = "騷棟";//姓名

我們就可以在Student對(duì)象中使用super關(guān)鍵字來(lái)訪問(wèn)到這個(gè)屬性.使用方式如下所示.當(dāng)然了,基類中的方法與屬性調(diào)用時(shí)一樣的.

super.peopleName



本文所有內(nèi)容詳情可查看Think in Java(Java編程思想)第七章的繼承部分,所以還是建議大家去看原書.本文只是作為學(xué)習(xí)筆記,如有紕漏,歡迎指出.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容