2.2 繼承

繼承的概念

繼承是面向?qū)ο缶幊碳夹g(shù)的一塊基石但金,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類夕膀。
繼承就是子類繼承父類的特征和行為箫章,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法都办,或子類從父類繼承方法嫡锌,使得子類具有父類相同的行為。

生活中的繼承

兔子和羊?qū)儆谑巢輨?dòng)物類琳钉,獅子和豹屬于食肉動(dòng)物類世舰。
食草動(dòng)物和食肉動(dòng)物又是屬于動(dòng)物類。
所以繼承需要符合的關(guān)系是:is-a槽卫,父類更通用跟压,子類更具體。
雖然食草動(dòng)物和食肉動(dòng)物都是屬于動(dòng)物歼培,但是兩者的屬性和行為上有差別震蒋,所以子類會(huì)具有父類的一般特性也會(huì)具有自身的特性茸塞。

繼承的語(yǔ)法

在 Java 中通過(guò) extends 關(guān)鍵字可以申明一個(gè)類是從另外一個(gè)類繼承而來(lái)的,一般形式如下:

class 父類 {
}
 
class 子類 extends 父類 {
}

為什么需要繼承

接下來(lái)我們通過(guò)實(shí)例來(lái)說(shuō)明這個(gè)需求查剖。
開(kāi)發(fā)動(dòng)物類钾虐,其中動(dòng)物分別為企鵝以及老鼠,要求如下:
企鵝:屬性(姓名笋庄,id)效扫,方法(吃,睡直砂,自我介紹)
老鼠:屬性(姓名菌仁,id),方法(吃静暂,睡济丘,自我介紹)

企鵝類:

public class Penguin { 
    private String name; 
    private int id; 
    public Penguin(String myName, int  myid) { 
        name = myName; 
        id = myid; 
    } 
    public void eat(){ 
        System.out.println(name+"正在吃"); 
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() { 
        System.out.println("大家好!我是"         + id + "號(hào)" + name + "."); 
    } 
}

老鼠類:

public class Mouse { 
    private String name; 
    private int id; 
    public Mouse(String myName, int  myid) { 
        name = myName; 
        id = myid; 
    } 
    public void eat(){ 
        System.out.println(name+"正在吃"); 
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() { 
        System.out.println("大家好洽蛀!我是"         + id + "號(hào)" + name + "."); 
    } 
}

從這兩段代碼可以看出來(lái)摹迷,代碼存在重復(fù)了,導(dǎo)致后果就是代碼量大且臃腫郊供,而且維護(hù)性不高(維護(hù)性主要是后期需要修改的時(shí)候峡碉,就需要修改很多的代碼,容易出錯(cuò))驮审,所以要從根本上解決這兩段代碼的問(wèn)題鲫寄,就需要繼承,將兩段代碼中相同的部分提取出來(lái)組成 一個(gè)父類.

公共父類:

public class Animal { 
    private String name;  
    private int id; 
    public Animal(String myName, int myid) { 
        name = myName; 
        id = myid;
    } 
    public void eat(){ 
        System.out.println(name+"正在吃"); 
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() { 
        System.out.println("大家好头岔!我是"         + id + "號(hào)" + name + "."); 
    } 
}

這個(gè)Animal類就可以作為一個(gè)父類塔拳,然后企鵝類和老鼠類繼承這個(gè)類之后,就具有父類當(dāng)中的屬性和方法峡竣,子類就不會(huì)存在重復(fù)的代碼靠抑,維護(hù)性也提高,代碼也更加簡(jiǎn)潔适掰,提高代碼的復(fù)用性(復(fù)用性主要是可以多次使用颂碧,不用再多次寫(xiě)同樣的代碼) 繼承之后的代碼.

企鵝類:

public class Penguin extends Animal { 
    public Penguin(String myName, int myid) { 
        super(myName, myid); 
    } 
}

老鼠類:

public class Mouse extends Animal { 
    public Mouse(String myName, int myid) { 
        super(myName, myid); 
    } 
}

繼承的特性

  • 在 Java 中,類的繼承是單一繼承类浪,也就是說(shuō)载城,一個(gè)子類只能擁有一個(gè)父類,所以 extends 只能繼承一個(gè)類费就。
  • 子類擁有父類非private的屬性诉瓦,方法。
  • 子類可以擁有自己的屬性和方法,即子類可以對(duì)父類進(jìn)行擴(kuò)展睬澡。
  • 子類可以用自己的方式實(shí)現(xiàn)父類的方法固额。
  • Java的繼承是單繼承,但是可以多重繼承煞聪,單繼承就是一個(gè)子類只能繼承一個(gè)父類斗躏,多重繼承就是,例如A類繼承B類昔脯,B類繼承C類啄糙,所以按照關(guān)系就是C類是B類的父類,B類是A類的父類云稚,這是java繼承區(qū)別于C++繼承的一個(gè)特性隧饼。
  • 繼承提高了類之間的耦合性(繼承的缺點(diǎn),耦合度高就會(huì)造成代碼之間的聯(lián)系)碱鳞。

super 與 this 關(guān)鍵字

super關(guān)鍵字:我們可以通過(guò)super關(guān)鍵字來(lái)實(shí)現(xiàn)對(duì)父類成員的訪問(wèn)桑李,用來(lái)引用當(dāng)前對(duì)象的父類踱蛀。
this關(guān)鍵字:指向自己的引用窿给。
實(shí)例

public class SuperDemo {
    public static void main(String []args) {
        new SubClass().showMessage();
    }
}
 
class SuperClass {
    int i = 50;
}
 
class SubClass extends SuperClass {
    int i =100;
    public void showMessage() {
        System.out.printf("super.i = %d, this.i = %d\n", super.i, this.i);
    }
}

輸出結(jié)果為:

super.i = 50, this.i = 100

final關(guān)鍵字

final 關(guān)鍵字聲明類可以把類定義為不能繼承的,即最終類率拒;或者用于修飾方法崩泡,該方法不能被子類重寫(xiě):
聲明類:

final class 類名 {//類體}

聲明方法:

修飾符(public/private/default/protected) final 返回值類型 方法名

注:實(shí)例變量也可以被定義為 final,被定義為 final 的變量不能被修改猬膨。被聲明為 final 類的方法自動(dòng)地聲明為 final角撞,但是實(shí)例變量并不是 final

構(gòu)造函數(shù)

子類不能繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù)),但是父類的構(gòu)造器帶有參數(shù)的勃痴,則必須在子類的構(gòu)造器中顯式地通過(guò)super關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表谒所。
如果父類有無(wú)參構(gòu)造器,則在子類的構(gòu)造器中用super調(diào)用父類構(gòu)造器不是必須的沛申,如果沒(méi)有使用super關(guān)鍵字劣领,系統(tǒng)會(huì)自動(dòng)調(diào)用父類的無(wú)參構(gòu)造器。
實(shí)例

class SuperClass {
  private int n;
  SuperClass(){
    System.out.println("SuperClass()");
  }
  SuperClass(int n) {
    System.out.println("SuperClass(int n)");
    this.n = n;
  }
}
class SubClass extends SuperClass{
  private int n;
  
  SubClass(){
    super(300);
    System.out.println("SubClass");
  }  
  
  public SubClass(int n){
    System.out.println("SubClass(int n):"+n);
    this.n = n;
  }
}
public class TestSuperSub{
  public static void main (String args[]){
    SubClass sc = new SubClass();
    SubClass sc2 = new SubClass(200); 
  }
}

輸出結(jié)果為:

SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铁材,一起剝皮案震驚了整個(gè)濱河市尖淘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌著觉,老刑警劉巖村生,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饼丘,居然都是意外死亡趁桃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卫病,“玉大人屡穗,你說(shuō)我怎么就攤上這事『龈兀” “怎么了村砂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屹逛。 經(jīng)常有香客問(wèn)我础废,道長(zhǎng),這世上最難降的妖魔是什么罕模? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任评腺,我火速辦了婚禮,結(jié)果婚禮上淑掌,老公的妹妹穿的比我還像新娘蒿讥。我一直安慰自己,他們只是感情好抛腕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布芋绸。 她就那樣靜靜地躺著,像睡著了一般担敌。 火紅的嫁衣襯著肌膚如雪摔敛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天全封,我揣著相機(jī)與錄音马昙,去河邊找鬼。 笑死刹悴,一個(gè)胖子當(dāng)著我的面吹牛行楞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播土匀,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼子房,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了恒削?” 一聲冷哼從身側(cè)響起池颈,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钓丰,沒(méi)想到半個(gè)月后躯砰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡携丁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年琢歇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兰怠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡李茫,死狀恐怖揭保,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魄宏,我是刑警寧澤秸侣,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宠互,受9級(jí)特大地震影響味榛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜予跌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一搏色、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧券册,春花似錦频轿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至考阱,卻和暖如春翠忠,著一層夾襖步出監(jiān)牢的瞬間鞠苟,已是汗流浹背乞榨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当娱,地道東北人吃既。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跨细,于是被迫代替她去往敵國(guó)和親鹦倚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法冀惭,類相關(guān)的語(yǔ)法震叙,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法散休,異常的語(yǔ)法媒楼,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,632評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit戚丸,java的開(kāi)發(fā)和運(yùn)行環(huán)境划址,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,653評(píng)論 0 11
  • 123.繼承 一個(gè)類可以從另外一個(gè)類繼承方法,屬性和其他特征。當(dāng)一個(gè)類繼承另外一個(gè)類時(shí), 繼承類叫子類, 被繼承的...
    無(wú)灃閱讀 1,392評(píng)論 2 4
  • 本來(lái)對(duì)《七月與安生》沒(méi)有什么好感,倒是偶然看到金馬獎(jiǎng)兩個(gè)女主角的發(fā)言夺颤,激發(fā)了去看看的欲望痢缎,沒(méi)想到這竟然是一部...
    清風(fēng)拍肩閱讀 239評(píng)論 0 0
  • 別給自己的心里套上牢籠
    人谷一閱讀 169評(píng)論 0 0