亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java基礎教程之繼承詳解

2019-11-26 15:26:32
字體:
來源:轉載
供稿:網友

繼承(inheritance)是面向對象的重要概念。繼承是除組合(composition)之外,提高代碼重復可用性(reusibility)的另一種重要方式。我們在組合(composition)中看到,組合是重復調用對象的功能接口。我們將看到,繼承可以重復利用已有的類的定義。

類的繼承

我們之前定義類的時候,都是從頭開始,詳細的定義該類的每一個成員。比如下面的Human類:

復制代碼 代碼如下:

class Human
{  
   /**
     * accessor
     */
    public int getHeight()
    {
       return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

    /**
     * breath
     */
    public void breath()
    {
        System.out.println("hu...hu...");
    }

    private int height;
}

從上面的類定義,我們可以了解該類的所有細節: 該類的數據成員,該類的方法,該類的接口。

現在要定義一個新的類,比如Woman類,并假設Woman與Human類相當類似:


Human & Woman

我們可以像以前一樣,從頭開始,完整的定義Woman類:

復制代碼 代碼如下:

class Woman
{
    /**
     * accessor
     */
    public int getHeight()
    {
       return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }


    /**
     * breath
     */
    public void breath()
    {
        System.out.println("hu...hu...");
    }

    /**
     * new method
     */
    public Human giveBirth()
    {
        System.out.println("Give birth");
        return (new Human(20));
    }

    private int height;
}

一個程序員在寫上面程序的時候,會有很大的煩惱。許多定義都曾在Human類中寫過,但我們還要重新敲一遍。Woman類只新增了一個giveBirth()方法 (該方法創建并返回一個新的Human對象)。

利用繼承,我們可以避免上面的重復。讓Woman類繼承自Human類,Woman類就自動擁有了Human類中所有public成員的功能。

我們用extends關鍵字表示繼承:

復制代碼 代碼如下:

class Woman extends Human
{
    /**
     * new method
     */
    public Human giveBirth()
    {
        System.out.println("Give birth");
        return (new Human(20));
    }
}

這樣,我們就省去了大量的輸入。通過繼承,我們創建了一個新類,叫做衍生類(derived class)。被繼承的類(Human)稱為基類(base class)。衍生類以基類作為自己定義的基礎,并補充基類中沒有定義的giveBirth()方法。繼承關系可以表示為:

繼承: 箭頭指向基類

可以用以下Test類測試:

復制代碼 代碼如下:

public class Test
{
    public static void main(String[] args)
    {
        Woman aWoman = new Woman();
        aWoman.growHeight(120);
        System.out.println(aWoman.getHeight());                                            
    }
}

衍生層

通過繼承,我們創建了Woman類。整個過程可以分為三個層次: 基類定義,衍生類定義,外部使用。

基類定義的層次就是正常的定義一個類,比如上面的Human類定義。

在外部使用者看來(比如Test類中創建Woman類對象),衍生類有一個統一的外部接口:

對于外部使用者來說,上述接口就已經足夠了。僅從接口看,衍生類也沒有什么特別之處。

 然而,當程序員在衍生類定義的層次時,就必須要小心:

首先,接口是混合的: getHeight()方法和growHeight()方法來自基類,giveBirth()方法則是在衍生類內部定義的。

還有更加復雜的地方。我們之前在類的內部可以自由訪問類的成員(利用this指代對象)。然而,當我們在Woman類的定義范圍內,我們無法訪問基類Human的private成員。我們記得private的含義: private的成員僅供該類內部使用。Woman類是一個不同于Human類的新類,所以位于Human類的外部。在衍生類中,不能訪問基類的private成員。

但有趣的是,我們的growHeight()和getHeight()方法依然可以運行。這說明基類的private成員存在,我們只是不能直接訪問。

為了清晰概念,我們需要了解衍生類對象的生成機制。當我們創建一個衍生類的對象時,Java實際上先創建了一個基類對象(subobject),并在基類對象的外部(注意,這里是基類對象的外部,衍生類對象的內部),增加衍生類定義的其他成員,構成一個衍生類對象。外部使用者能看到的,就是基類和衍生類的public成員。如下圖:

基類對象與衍生類對象

圖中黃色為基類對象。基層的成員之間可以互相訪問 (利用Human類定義中的this指代基類對象)。

藍色部分為衍生對象新增的內容,我將這部分稱為衍生層。藍色和黃色部分共同構成衍生對象。衍生層的成員可以相互訪問(Woman定義中的this)。更進一步,我們還可以訪問基層中public的成員。為此,我們用super關鍵字來指代基類對象,使用super.member的方式來表示基層的(public)成員。

當我們位于衍生層時(也就是在定義Woman類時),不能訪問紅色的基層private成員。當我們位于外部時,既不能訪問紫色的衍生層private成員,也不能訪問紅色的基層private成員。

(衍生層的private成員有訪問禁忌,所以標為斜線?;鶎拥膒rivate成員訪問禁忌最多,所以標為交叉斜線)

super和this類似,也是隱式參數。我們在類定義的不同層次時,this會有不同的含義。要小心的使用this和super關鍵字。

(Java并不強制使用this和super。Java在許多情況下可以自動識別成員的歸屬。但我覺得這是個好習慣。)

protected

我們之前介紹了兩個訪問權限相關的關鍵字,private和public,它們控制了成員的外部可見性?,F在,我們介紹一個新的訪問權限關鍵字: protected。

標為protected的成員在該類及其衍生類中可見。這個概念很容易理解,就是說,基類的protected成員可以被衍生層訪問,但不能被外部訪問,如下圖:

方法覆蓋

衍生類對象的外部接口最終由基類對象的public成員和衍生層的public成員共同構成。如果基類public成員和衍生層的public成員同名,Java接口中呈現的究竟是哪一個呢?

我們在構造方法與方法重載中已經提到,Java是同時通過方法名和參數列表來判斷所要調用的方法的。方法是由方法名和參數列表共同決定的。上述問題中,如果只是方法名相同,而參數列表不同,那么兩個方法會同時呈現到接口,不會給我們造成困擾。外部調用時,Java會根據提供的參數,來決定使用哪個方法 (方法重載)。

如果方法名和參數列表都相同呢? 在衍生層時,我們還可以通過super和this來確定是哪一個方法。而在外部時,我們呈現的只是統一接口,所以無法同時提供兩個方法。這種情況下,Java會呈現衍生層的方法,而不是基層的方法。

這種機制叫做方法覆蓋(method overriding)。方法覆蓋可以被很好的利用,用于修改基類成員的方法。比如,在衍生層,也就是定義Woman時,可以修改基類提供的breath()方法:

復制代碼 代碼如下:

class Woman extends Human
{/**
     * new method
     */
    public Human giveBirth()
    {
        System.out.println("Give birth");
        return (new Human(20));
    }

    /**
     * override Human.breath()
     */
    public void breath()
    {
        super.breath();
        System.out.println("su...");
    }
}

注意,此時我們位于衍生層,依然可以通過super來調用基類對象的breath()方法。當我們外部調用Woman類時,由于方法覆蓋,就無法再調用基類對象的該方法了。

方法覆蓋保持了基類對象的接口,而采用了衍生層的實現。

構造方法

在了解了基類對象和衍生層的概念之后,衍生類的構造方法也比較容易理解。

我們要在衍生類的定義中定義與類同名的構造方法。在該構造方法中:

1.由于在創建衍生對象的時候,基類對象先被創建和初始化,所以,基類的構造方法應該先被調用。我們可以使用super(argument list)的語句,來調用基類的構造方法。

2.基類對象創建之后,開始構建衍生層 (初始化衍生層成員)。這和一般的構建方法相同,參考構造方法與方法重載

比如下面的程序中,Human類有一個構造方法:

復制代碼 代碼如下:

class Human
{  

    /**
     * constructor
     */
    public Human(int h)
    {
        this.height = h;
    }

    /**
     * accessor
     */
    public int getHeight()
    {
       return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

    /**
     * breath
     */
    public void breath()
    {
        System.out.println("hu...hu...");
    }

    private int height;
}

衍生類Woman類的定義及其構造方法:

復制代碼 代碼如下:

class Woman extends Human
{
    /**
     * constructor
     */
    public Woman(int h)
    {
        super(h); // base class constructor
        System.out.println("Hello, Pandora!");
    }

    /**
     * new method
     */
    public Human giveBirth()
    {
        System.out.println("Give birth");
        return (new Human(20));
    }

    /**
     * override Human.breath()
     */
    public void breath()
    {
        super.breath();
        System.out.println("su...");
    }
}

總結

extends

method overriding

protected

super.member, super()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲成人av在线| 欧美大片免费观看在线观看网站推荐| 日韩中文字幕亚洲| 国产亚洲精品久久久久久| 国产免费一区二区三区在线能观看| 国产一区二区在线免费视频| www.午夜精品| 欧美在线一级视频| 在线日韩精品视频| 国产www精品| 国内精品一区二区三区| 日韩在线免费视频| 91色琪琪电影亚洲精品久久| yw.139尤物在线精品视频| 日韩av不卡在线| 国产日本欧美在线观看| 欧美激情视频一区二区| 日韩中文在线不卡| 久久久人成影片一区二区三区| 亚洲精品白浆高清久久久久久| 欧美精品成人91久久久久久久| 中文字幕成人在线| 亚洲情综合五月天| 国产精品嫩草影院一区二区| 在线日韩av观看| 欧美日韩国产123| 欧美日本在线视频中文字字幕| 成人国产精品免费视频| 国产乱肥老妇国产一区二| 欧美激情xxxxx| 国产精品视频午夜| 欧美美最猛性xxxxxx| 日韩在线观看免费高清完整版| 88xx成人精品| 国产精品视频免费在线观看| 亚洲天堂免费在线| 国色天香2019中文字幕在线观看| 日韩欧美亚洲范冰冰与中字| 久久久久国色av免费观看性色| 亚洲天堂一区二区三区| 久久久精品网站| 日韩中文字幕在线免费观看| 国产成人精品免高潮在线观看| 色综合久久久久久中文网| 国产视频精品在线| 亚洲欧美日韩国产精品| 中文字幕v亚洲ⅴv天堂| 91国产一区在线| 亚洲精品国产精品久久清纯直播| 92版电视剧仙鹤神针在线观看| 欧美另类极品videosbest最新版本| 色哟哟入口国产精品| 欧美日韩中文字幕综合视频| 在线日韩日本国产亚洲| 亚洲人成在线播放| 欧美性极品xxxx娇小| 欧美性猛交视频| 久久琪琪电影院| 乱亲女秽乱长久久久| 九九九热精品免费视频观看网站| 亚洲精品理论电影| 亚洲福利小视频| 日本不卡高字幕在线2019| 91麻豆桃色免费看| 亚洲成色777777女色窝| 色偷偷av亚洲男人的天堂| 美女av一区二区| 国产日韩欧美电影在线观看| 国产欧美日韩精品在线观看| 国产精品福利小视频| 国产精品久久久久久久久男| 精品美女国产在线| 亚洲国产精品热久久| 97香蕉久久超级碰碰高清版| 亚洲精品久久久久久久久久久| 日韩在线视频国产| 亚洲精选中文字幕| 欧美香蕉大胸在线视频观看| 91久久在线播放| 精品亚洲一区二区三区四区五区| 亚洲国产天堂久久综合网| 欧美wwwxxxx| 亚洲美女视频网站| 91欧美精品成人综合在线观看| 亲子乱一区二区三区电影| 九色成人免费视频| 久久久久久久久久久久久久久久久久av| 欧美性感美女h网站在线观看免费| 国产乱肥老妇国产一区二| 国产精品久久久久久久一区探花| 日韩av综合网| 国产日韩换脸av一区在线观看| 欧美日韩在线观看视频| 国产精品福利无圣光在线一区| 91系列在线观看| 亚洲www永久成人夜色| 久久久国产视频| 国产成人激情小视频| 国产69久久精品成人看| 国产91色在线|免| 国产亚洲视频在线| 91情侣偷在线精品国产| 亚洲黄在线观看| 国产精品欧美在线| 久久影视免费观看| 在线国产精品视频| 日韩欧美一区二区在线| 91精品国产乱码久久久久久久久| 精品国产老师黑色丝袜高跟鞋| 亚洲成人激情小说| 国产精品入口日韩视频大尺度| 91日韩在线播放| 色系列之999| 国产精品com| 色综合久久精品亚洲国产| 亚洲国产三级网| 国产在线久久久| 国产欧美一区二区三区久久人妖| 欧美亚洲国产日本| 最新的欧美黄色| 日韩av资源在线播放| 亚洲精品白浆高清久久久久久| 亚洲国产另类久久精品| 亚洲欧美综合区自拍另类| 国产成人精彩在线视频九色| 夜夜嗨av色综合久久久综合网| 久久精品国产2020观看福利| 欧洲美女7788成人免费视频| 国产精品欧美风情| 日韩欧美亚洲一二三区| 伊是香蕉大人久久| 欧美成人精品在线观看| 韩曰欧美视频免费观看| 欧美日韩aaaa| 欧美精品久久一区二区| 国产伦精品免费视频| 日本一区二区在线免费播放| 亚洲视频欧美视频| 亚洲无限av看| 一区国产精品视频| 91精品在线观| 51视频国产精品一区二区| 欧美孕妇孕交黑巨大网站| 色噜噜狠狠狠综合曰曰曰88av| 欧美精品免费在线观看| 国产精品福利片| 6080yy精品一区二区三区| 久久精品国产电影| 97超级碰在线看视频免费在线看| 91日本在线观看| 色多多国产成人永久免费网站| 国产精品网红福利| 性色av一区二区咪爱| 日韩人在线观看| 69**夜色精品国产69乱| 久久影院在线观看| 国产精品日韩欧美| 国产精品pans私拍| 亚洲成人黄色在线观看| 国产亚洲人成a一在线v站| 久久久久久免费精品| 欧美精品www| 欧美一级黄色网| 欧美成人亚洲成人|