遇到什么問(wèn)題
子類(lèi)拓展了父類(lèi),可以獲得父類(lèi)的部分方法和成員變量∪侔ぃ可是當(dāng)父類(lèi)的某個(gè)方法不適合于子類(lèi)本身的特征時(shí),此時(shí)怎么辦朴摊?
如:企鵝是鳥(niǎo)類(lèi)中的一個(gè)特殊品種默垄,所以企鵝類(lèi)是鳥(niǎo)類(lèi)的一個(gè)子類(lèi),但是鳥(niǎo)類(lèi)有飛翔的功能甚纲,但是對(duì)應(yīng)企鵝口锭,飛翔的行為顯然不適合于它。
怎么解決
使用方法覆蓋(Override)
什么是方法覆蓋
當(dāng)父類(lèi)的某一個(gè)行為不符合子類(lèi)具體的特征的時(shí)候,此時(shí)子類(lèi)需要重新定義父類(lèi)的方法,并重寫(xiě)方法體.
方法覆蓋規(guī)則(Override)(一同兩小一大):
- 一同:
實(shí)例方法簽名必須相同介杆。 (方法簽名= 方法名 + 方法的參數(shù)列表) - 兩芯椴佟:
1.子類(lèi)方法的返回值類(lèi)型是和父類(lèi)方法的返回類(lèi)型相同或者是其子類(lèi)。
也就是說(shuō),子類(lèi)可以返回一個(gè)更加具體的類(lèi).
2.子類(lèi)方法聲明拋出的異常類(lèi)型和父類(lèi)方法聲明拋出的異常類(lèi)型相同或者是其子類(lèi)春哨。
也就是說(shuō),子類(lèi)方法中聲明拋出的異常小于或等于父類(lèi)方法聲明拋出異常類(lèi)型荆隘;子類(lèi)方法可以同時(shí)聲明拋出多個(gè)屬于父類(lèi)方法聲明拋出異常類(lèi)的子類(lèi)(RuntimeException類(lèi)型除外). - 一大:
子類(lèi)方法的訪問(wèn)權(quán)限比父類(lèi)方法訪問(wèn)權(quán)限更大或相等。
private修飾的方法不能被子類(lèi)所繼承,也就不存在覆蓋的概念.
//方法覆蓋 Override : 解決了子類(lèi)繼承父類(lèi)后,父類(lèi)方法不適合于子類(lèi)的問(wèn)題
public class OverrideDemo {
public static void main(String[] args) {
Bird bird = new Bird();
Penguin penguin = new Penguin();
bird.fly();//我是鳥(niǎo)類(lèi),我會(huì)飛
penguin.fly();//我是企鵝,但是我飛不了
}
}
//鳥(niǎo)類(lèi),有會(huì)飛的功能
class Bird {
public void fly() {
System.out.println("我是鳥(niǎo)類(lèi),我會(huì)飛");
}
}
//企鵝類(lèi),但是不會(huì)飛
class Penguin extends Bird {
//方法覆蓋原則,一同兩小
//同:方法名相同 :方法簽名= 方法名 + 方法的參數(shù)列表
public void fly() {
System.out.println("我是企鵝,但是我飛不了");
}
}