方法重寫以及里氏替換原則

一臀叙、方法重寫(override)

  1. 在子類中將父類的方法再重新定義一遍稱之為方法重寫

  2. 什么時候需要方法重寫:

    • 如果父類繼承的方法不能滿足子類的需要,或者不適合子類的需要劝萤。此時子類可以從父類繼承的方法重寫定義為滿足自己需要的方法渊涝。

    在下例中,Cat類繼承了Pet的sound方法床嫌,但是并不適用于cat驶赏,此時可以進(jìn)行方法的重寫。

public class Pet {
    private int weight ;
    private String color;
    //方法sound
    public void sound(){
    }
}
public class Cat extends Pet {
    @Override//方法重寫既鞠,實(shí)現(xiàn)貓叫
    public void sound() {
        System.out.println("喵喵喵");
    }
}

再創(chuàng)建一個Dog類,讓Dog類也繼承Pet類盖文,并且也進(jìn)行方法重寫嘱蛋,實(shí)現(xiàn)狗的叫聲

public class Dog extends Pet{
    @Override
    public void sound(){
        System.out.println("汪汪汪");
    }
}

在main方法中創(chuàng)建對象,調(diào)用sound方法五续,輸出cat和dog的叫聲

public class PetShop{//寵物店
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();//調(diào)用狗的sound()
        Cat cat = new Cat();
        cat.sound();//調(diào)用貓的sound()
    }
}

使用方法重寫的注意事項(xiàng):

  • 在方法重寫時洒敏,方法的返回值、方法名疙驾、參數(shù)都要和父類一樣凶伙,否則就算不是方法重寫了,而是cat類新定義的方法它碎。
  • 子類方法覆蓋父類方法函荣,必須要保證子類訪問權(quán)限大于父類訪問權(quán)限
    public void sound(){
    }//Pet類中為public

而在子類中,訪問權(quán)限為private扳肛,訪問權(quán)限低于父類而報錯

public class Dog extends Pet{
    @Override
    private void sound(){//private處報錯
        System.out.println("汪汪汪");
    }
}
  • 重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致傻挂,或者是其子類

二、里氏替換原則

里氏替換原則(父類引用指向子類實(shí)例)

  • 里氏替換原則主要闡述了有關(guān)繼承的一些原則挖息,也就是什么時候應(yīng)該使用繼承金拒,什么時候不應(yīng)該使用繼承套腹,以及其中蘊(yùn)含的原理。里氏替換原是繼承復(fù)用的基礎(chǔ)笤休,它反映了基類與子類之間的關(guān)系蛤育,是對開閉原則的補(bǔ)充瓦糕,是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范咕娄。
  • 簡單的理解為一個軟件實(shí)體如果使用的是一個父類,那么一定適用于其子類费变,而且它察覺不出父類對象和子類對象的區(qū)別。也就是說吁峻,軟件里面,把父類都替換成它的子類矮慕,程序的行為沒有變化痴鳄。如果軟件開發(fā)中使用的是其子類的話痪寻,由于子類含有一些父類所沒有的特征槽华,所以父類不能代替其子類。相反,子類一定含有父類的公開的方法勇凭,那么子類一定可以代替父類虾标,也就是使用父類的地方都可以使用子類

在上邊的例子中璧函,我們每次都是創(chuàng)建了cat或者dog對象來調(diào)用sound方法蘸吓,是指定了貓叫還是狗叫库继。那么如果要求的是一只pet來叫呢?

public class Test {
    public static void main(String[] args) {
        Pet pet = new Dog();
        pet.sound();//pet調(diào)用Dog中sound方法
        pet = new Cat();
        pet.sound();//pet調(diào)用Cat中sound方法
    }
}

在例子中拜英,將父類Pet的引用指向了子類的實(shí)例琅催,通過pet調(diào)用sound方法,將子類替代了父類狰右。

父類引用指向子類對象的結(jié)論

  • 父類引用可以代表任何其子類對象棋蚌,代碼表現(xiàn)為 Pet pet = new Dog() 或者 Pet pet = new Cat()
  • 父類引用指向哪個子類對象谷暮,調(diào)用的方法就是哪個子類中的方法。
  • 父類引用指向子類對象其實(shí)是增強(qiáng)了父類的功能瓤漏。

由于子類含有一些父類所沒有的特征蝶俱,所以父類不能代替其子類

例如

 public void climb(){
        System.out.println("貓貓爬樹中榨呆。积蜻。竿拆。");
    }//Cat類新增的方法

在Cat類中新增了父類沒有的climb()方法

pet = new Cat();
pet.sound();
pet.climb();//climb處報錯

代碼報錯了,為什么呢央勒?

因?yàn)楦割愐谜{(diào)用方法時稳吮,必須知道子類有哪些方法灶似,知道的才能調(diào)用酪惭,不知道的是不能調(diào)用的。

子類Cat新增的climb()方法父類并不知道鲫懒,但是父類一定知道子類從父類繼承的方法窥岩。

所以父類引用只能調(diào)用子類與父類保持繼承關(guān)系的方法颂翼【卫穑可以是重寫的方法集歇。

里氏替換中的調(diào)用規(guī)則

  • 父類引用只能調(diào)用子類從父類繼承的方法际歼。
  • 當(dāng)子類重寫父類方法后鹅心,父類引用調(diào)用的是子類重寫的方法,否則調(diào)用子類從父類繼承的方法输枯。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末型奥,一起剝皮案震驚了整個濱河市厢汹,隨后出現(xiàn)的幾起案子界弧,更是在濱河造成了極大的恐慌咽瓷,老刑警劉巖设凹,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月匣,死亡現(xiàn)場離奇詭異,居然都是意外死亡锄开,警方通過查閱死者的電腦和手機(jī)萍悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寓免,“玉大人癣诱,你說我怎么就攤上這事。” “怎么了实抡?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵吆寨,是天一觀的道長。 經(jīng)常有香客問我,道長盒延,這世上最難降的妖魔是什么添寺? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任票罐,我火速辦了婚禮该押,結(jié)果婚禮上朝聋,老公的妹妹穿的比我還像新娘金度。我一直安慰自己跟伏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布翩瓜。 她就那樣靜靜地躺著受扳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兔跌。 梳的紋絲不亂的頭發(fā)上勘高,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音坟桅,去河邊找鬼华望。 笑死,一個胖子當(dāng)著我的面吹牛仅乓,可吹牛的內(nèi)容都是我干的赖舟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼夸楣,長吁一口氣:“原來是場噩夢啊……” “哼宾抓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起豫喧,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤石洗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后紧显,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讲衫,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年鸟妙,在試婚紗的時候發(fā)現(xiàn)自己被綠了焦人。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡重父,死狀恐怖花椭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情房午,我是刑警寧澤矿辽,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站郭厌,受9級特大地震影響袋倔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜折柠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一宾娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇售,春花似錦前塔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至困乒,卻和暖如春寂屏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娜搂。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工迁霎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人百宇。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓欧引,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恳谎。 傳聞我的和親對象是個殘疾皇子芝此,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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