Java 繼承

知識(shí)點(diǎn)

  • 什么是繼承
    繼承是Java面向?qū)ο笕筇匦裕ǚ庋b、繼承洽瞬、多態(tài))之一,用extends關(guān)鍵字表示繼承儡首,比如有A類片任、B類偏友,B類繼承A類蔬胯,如下寫法:
    public class B extends A{ }通常我們管A類叫父類,管B類叫子類位他。
    如果一個(gè)類沒(méi)有寫extends關(guān)鍵字氛濒,那這個(gè)類默認(rèn)繼承java.lang.Object類,Object類是所有類的祖先類鹅髓。

  • 何時(shí)用繼承
    繼承通常是為了消除代碼的重復(fù)舞竿、冗余,使代碼更易維護(hù)窿冯。說(shuō)白了就是將一些公共的屬性骗奖、方法提取出來(lái),放到一個(gè)通用的類中醒串,然后有需要的類再繼承這個(gè)通用的類执桌。
    比如普通員工和經(jīng)理,他們都享有公司五險(xiǎn)一金的基本福利芜赌,普通員工每年有一次國(guó)內(nèi)游的福利仰挣,經(jīng)理每年有一次帶家人國(guó)內(nèi)游以及一次國(guó)外旅游的福利。這里很明顯可以把五險(xiǎn)一金福利放到父類中缠沈,因?yàn)橹灰枪締T工就有膘壶,這是公共的福利错蝴。詳見(jiàn)下文實(shí)例分析。

  • 繼承的限制
    final類是不允許被繼承的颓芭,final方法是不允許被子類重寫的顷锰。通過(guò)關(guān)鍵字就很好理解,final是最終的意思畜伐,既然是最終了馍惹,那也就不會(huì)有下一層級(jí)的子類了。
    不允許多繼承(接口可以彌補(bǔ)這個(gè)缺陷玛界,在接口中詳解)万矾。比如有A類、B類慎框、C類三個(gè)類良狈,C類不能同時(shí)繼承A類、B類:public class C extends A,B { }以上寫法是錯(cuò)誤的笨枯。

  • 繼承中子類擁有的權(quán)限
    子類擁有父類所有非private的屬性和方法薪丁;
    子類可以擁有自己的屬性和方法;
    子類可以重寫父類非final馅精、static聲明的方法严嗜;

  • super與this關(guān)鍵字
    通過(guò)super關(guān)鍵字可以訪問(wèn)父類非private的屬性、方法洲敢、構(gòu)造器漫玄,比如要在子類中訪問(wèn)父類的test()方法,可以用super.test()压彭,要訪問(wèn)父類的構(gòu)造器則是通過(guò)super()可以訪問(wèn)到父類的無(wú)參構(gòu)造器睦优,如果要訪問(wèn)有參構(gòu)造器則在括號(hào)中帶上參數(shù)即可;
    通過(guò)this關(guān)鍵字壮不,可以訪問(wèn)子類所有的屬性汗盘、方法、構(gòu)造器询一,說(shuō)白了就是指當(dāng)前類的引用了隐孽。
    注意:很多人認(rèn)為super與this引用是一樣的概念,實(shí)際不是的健蕊。this是當(dāng)前對(duì)象的引用菱阵,可以直接賦值給另一個(gè)對(duì)象變量,即可以使用Object obj = this;绊诲;而super其實(shí)是Java一個(gè)特殊關(guān)鍵字送粱,可以調(diào)用父類的非private的屬性、方法掂之、構(gòu)造器抗俄,但不能賦值給另一個(gè)對(duì)象變量脆丁,也就是不能使用 Object obj = super;

  • 繼承中的構(gòu)造器
    詳細(xì)可以查看我的這篇文章java 構(gòu)造器(構(gòu)造方法)使用詳細(xì)說(shuō)明

實(shí)例

需求:公司有普通員工和經(jīng)理,他們都享有公司五險(xiǎn)一金的基礎(chǔ)福利动雹,普通員工每年有一次國(guó)內(nèi)游的福利槽卫,經(jīng)理每年有一次帶家人國(guó)內(nèi)游以及一次國(guó)外旅游的福利。分別打印出普通員工的福利和經(jīng)理的福利胰蝠。

1.按沒(méi)有繼承的做法

定義普通員工類:

/**
 * 員工類
 */
public class Employee {
    /**
     * 基本福利
     */
    private String basicWelfare;

    /**
     * 國(guó)內(nèi)旅游福利
     */
    private String internalTour;
    /**
     * 構(gòu)造函數(shù)歼培,初始化福利
     */
    public Employee(){
        this.basicWelfare = "五險(xiǎn)一金";
        this.internalTour = "一年一次國(guó)內(nèi)游";
    }

    /**
     * 打印員工福利
     */
    public void printWelfare(){
        System.out.println(this.basicWelfare);
        System.out.println(this.internalTour);
    }

}

定義經(jīng)理類

/**
 * 經(jīng)理
 */
public class Manager{
    /**
     * 基本福利
     */
    private String basicWelfare;

    /**
     * 國(guó)內(nèi)旅游福利
     */
    private String internalTour;

    /**
     * 國(guó)外旅游福利
     */
    private String externalTour;
    
    /**
     * 構(gòu)造函數(shù),初始化福利
     */
    public Manager(){
        this.basicWelfare = "五險(xiǎn)一金";
        this.internalTour = "一年一次帶家人國(guó)內(nèi)游";
        this.externalTour = "一年一次國(guó)外旅游";
    }

    /**
     * 打印員工福利
     */
    public void printWelfare(){
        System.out.println(this.basicWelfare);
        System.out.println(this.internalTour);
        System.out.println(this.externalTour);
    }

}

以上兩個(gè)類茸塞,可以看到basicWelfare躲庄、internalTour兩個(gè)屬性以及printWelfare()方法是重復(fù)的。重復(fù)必然導(dǎo)致難維護(hù)钾虐!如果需求改為基本福利是六險(xiǎn)一金以及1000塊春節(jié)過(guò)節(jié)費(fèi)噪窘,那這兩個(gè)類都要改過(guò)去,不方便維護(hù)效扫,特別是類越多倔监,維護(hù)難度越大。此時(shí)繼承就能盡顯其優(yōu)勢(shì)菌仁!看以下例子浩习。

2. 按繼承的做法

分析需求,可以看到經(jīng)理的福利基本上是包含了普通員工的福利济丘,所以將員工類作為父類谱秽,并稍加改造,增加可以修改國(guó)內(nèi)旅游屬性的方法setInternalTour(String internalTour)闪盔,主要是因?yàn)閕nternalTour屬性是private的弯院,不能在子類訪問(wèn)到辱士,所以開(kāi)放了一個(gè)方法供子類調(diào)用泪掀。這個(gè)改造主要是因?yàn)榻?jīng)理的國(guó)內(nèi)游還可以帶上家人。

定義員工類(父類)

/**
 * 員工類
 */
public class Employee {
    /**
     * 基本福利
     */
    private String basicWelfare;

    /**
     * 國(guó)內(nèi)旅游福利
     */
    private String internalTour;

    /**
     * 初始化員工福利
     */
    public Employee(){
        this.basicWelfare = "五險(xiǎn)一金";
        this.internalTour = "一年一次國(guó)內(nèi)游";
    }

    /**
     * 可以設(shè)置國(guó)內(nèi)游的方法
     * @param internalTour
     */
    public void setInternalTour(String internalTour){
        this.internalTour = internalTour;
    }

    /**
     * 打印員工福利
     */
    public void printWelfare(){
        System.out.println(this.basicWelfare);
        System.out.println(this.internalTour);
    }

}

定義經(jīng)理類(子類)颂碘,繼承員工類

/**
 * 經(jīng)理類
 */
public class Manager extends Employee{

    /**
     * 國(guó)外旅游福利
     */
    private String externalTour;

    /**
     * 初始化經(jīng)理福利
     */
    public Manager(){
        //由于經(jīng)理國(guó)內(nèi)游還可以帶家人异赫,所以這里通過(guò)super.setInternalTour方法重新設(shè)置
        super.setInternalTour("一年一次帶家人國(guó)內(nèi)游");
        this.externalTour = "一年一次國(guó)外旅游";
    }

    /**
     * 重寫父類的printWelfare()方法
     * 由于父類已經(jīng)有printWelfare()方法并且可以打印基本福利和國(guó)內(nèi)游福利,
     * 所以直接通過(guò)super調(diào)用父類的printWelfare()方法打印基本福利和國(guó)內(nèi)游福利
     */
    @Override
    public void printWelfare(){
        //調(diào)用父類打印基本福利和國(guó)內(nèi)游福利头岔,
        //這里必須帶上super塔拳,否則就是調(diào)用子類的printWelfare(),那就是死循環(huán)了
        super.printWelfare();
        //打印國(guó)外游福利
        System.out.println(this.externalTour);
    }

}

測(cè)試類

public class ExtendsDemo {
    public static void main(String[] args){

        //打印員工福利
        Employee employee = new Employee();
        System.out.println("員工福利:");
        employee.printWelfare();

        //打印經(jīng)理福利
        Manager manager = new Manager();
        System.out.println("員工福利:");
        manager.printWelfare();
    }
}

執(zhí)行以上測(cè)試類峡竣,輸出:

員工福利:
五險(xiǎn)一金
一年一次國(guó)內(nèi)游

員工福利:
五險(xiǎn)一金
一年一次帶家人國(guó)內(nèi)游
一年一次國(guó)外旅游

通過(guò)該繼承的實(shí)例改造靠抑,就能很方便完成以上提出的需求改造,如果基本福利改為六險(xiǎn)一金适掰,那只要將Employee類中的五險(xiǎn)一金改為六險(xiǎn)一金即可颂碧;如果要增加一項(xiàng)基本福利荠列,那也直接在Employee類改造即可。

源碼獲取

以上示例都可以通過(guò)我的GitHub獲取完整的代碼载城,點(diǎn)擊獲取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肌似,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诉瓦,更是在濱河造成了極大的恐慌川队,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睬澡,死亡現(xiàn)場(chǎng)離奇詭異固额,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)煞聪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門对雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人米绕,你說(shuō)我怎么就攤上這事瑟捣。” “怎么了栅干?”我有些...
    開(kāi)封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵迈套,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碱鳞,道長(zhǎng)桑李,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任窿给,我火速辦了婚禮贵白,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崩泡。我一直安慰自己禁荒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布角撞。 她就那樣靜靜地躺著呛伴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谒所。 梳的紋絲不亂的頭發(fā)上热康,一...
    開(kāi)封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音劣领,去河邊找鬼姐军。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奕锌。 我是一名探鬼主播衫贬,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歇攻!你這毒婦竟也來(lái)了固惯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缴守,失蹤者是張志新(化名)和其女友劉穎葬毫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡穗,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贴捡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了村砂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烂斋。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖础废,靈堂內(nèi)的尸體忽然破棺而出汛骂,到底是詐尸還是另有隱情,我是刑警寧澤评腺,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布帘瞭,位于F島的核電站,受9級(jí)特大地震影響蒿讥,放射性物質(zhì)發(fā)生泄漏蝶念。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一芋绸、第九天 我趴在偏房一處隱蔽的房頂上張望媒殉。 院中可真熱鬧,春花似錦摔敛、人聲如沸廷蓉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苦酱。三九已至售貌,卻和暖如春给猾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颂跨。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工敢伸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恒削。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓池颈,卻偏偏與公主長(zhǎng)得像尾序,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躯砰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 一、繼承 概述繼承是面向?qū)ο蟮闹匾卣髦焕蠲#?dāng)多個(gè)類中存在相同的屬性和行為時(shí)揭保,將這些內(nèi)容抽取到單獨(dú)一個(gè)類中,那多個(gè)...
    java部落閱讀 632評(píng)論 0 0
  • 一味榛、繼承 1. 概述 繼承是面向?qū)ο蟮闹匾卣髦唬?dāng)多個(gè)類中存在相同的屬性和行為時(shí)予跌,將這些內(nèi)容抽取到單獨(dú)一個(gè)類中...
    陳凱冰閱讀 355評(píng)論 0 2
  • 繼承的概念 繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石励负,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。 繼承就是子類繼承父類的特征和...
    耳東陳_f1e5閱讀 977評(píng)論 0 4
  • 子類與父類匕得、子類的繼承性成員變量的隱藏與方法重寫super與final關(guān)鍵字對(duì)象類型轉(zhuǎn)換繼承與多態(tài)抽象方法與抽象類...
    David_Rao閱讀 223評(píng)論 0 0
  • 寫下題目之后我就不知道寫什么了继榆,題目太大,而我經(jīng)歷太少汁掠,面對(duì)它的時(shí)候略吨,就感覺(jué)到一座大山壓過(guò)來(lái),讓人窒息考阱。 但翠忠,畢竟...
    Dr魏閱讀 256評(píng)論 1 0