1.8 方法重写
在子類中如果創(chuàng)建了一個(gè)與父類中相同名稱、相同返回值類型、相同參數(shù)列表的方法,只是方法體中的實(shí)現(xiàn)不同,以實(shí)現(xiàn)不同于父類的功能,這種方式被稱為方法重寫(override),又稱為方法覆蓋。當(dāng)父類中的方法無(wú)法滿足子類需求或子類具有特有功能的時(shí)候,需要方法重寫。
子類可以根據(jù)需要,定義特定于自己的行為。既沿襲了父類的功能名稱,又根據(jù)子類的需要重新實(shí)現(xiàn)父類方法,從而進(jìn)行擴(kuò)展增強(qiáng)。
在重寫方法時(shí),需要遵循下面的規(guī)則:
- 參數(shù)列表必須完全與被重寫的方法參數(shù)列表相同。
- 返回的類型必須與被重寫的方法的返回類型相同(Java1.5 版本之前返回值類型必須一樣,之后的 Java版本放寬了限制,返回值類型必須小于或者等于父類方法的返回值類型)。
- 訪問(wèn)權(quán)限不能比父類中被重寫方法的訪問(wèn)權(quán)限更低(public>protected>default>private)。
- 重寫方法一定不能拋出新的檢査異常或者比被重寫方法聲明更加寬泛的檢査型異常。例如,父類的一個(gè)方法聲明了一個(gè)檢査異常 IOException,在重寫這個(gè)方法時(shí)就不能拋出 Exception,只能拋出 IOException 的子類異常,可以拋出非檢査異常。
另外還要注意以下幾條:
- 重寫的方法可以使用 @Override 注解來(lái)標(biāo)識(shí)。
- 父類的成員方法只能被它的子類重寫。
- 聲明為 final 的方法不能被重寫。
- 聲明為 static 的方法不能被重寫,但是能夠再次聲明。
- 構(gòu)造方法不能被重寫。
- 子類和父類在同一個(gè)包中時(shí),子類可以重寫父類的所有方法,除了聲明為 private 和 final 的方法。
- 子類和父類不在同一個(gè)包中時(shí),子類只能重寫父類的聲明為 public 和 protected 的非 final 方法。
- 如果不能繼承一個(gè)方法,則不能重寫這個(gè)方法。
例 1
每種動(dòng)物都有名字和年齡屬性,但是喜歡吃的食物是不同的,比如狗喜歡吃骨頭、貓喜歡吃魚(yú)等,因此每種動(dòng)物的介紹方式是不一樣的。
下面編寫 Java 程序,在父類 Animal 中定義 getInfo() 方法,并在子類 Cat 中重寫該方法, 實(shí)現(xiàn)貓的介紹方式。父類 Animal 的代碼如下:
public class Animal {public String name; // 名字public int age; // 年齡public Animal(String name, int age) {this.name = name;this.age = age;}public String getInfo() {return "我叫" + name + ",今年" + age + "歲了。";} }子類 Cat 的代碼如下:
public class Cat extends Animal {private String hobby;public Cat(String name, int age, String hobby) {super(name, age);this.hobby = hobby;}public String getInfo() {return "喵!大家好!我叫" + this.name + ",我今年" + this.age + "歲了,我愛(ài)吃" + hobby + "。";}public static void main(String[] args) {Animal animal = new Cat("小白", 2, "魚(yú)");System.out.println(animal.getInfo());} }如上述代碼,在 Animal 類中定義了一個(gè)返回值類型為 String、名稱為 getInfo() 的方法,而 Cat 類繼承自該類,因此 Cat 類同樣含有與 Animal 類中相同的 getInfo() 方法。但是我們?cè)?Cat 類中又重新定義了一個(gè) getInfo() 方法,即重寫了父類中的 getInfo() 方法。
在 main() 方法中,創(chuàng)建了 Cat 類的對(duì)象 animal,并調(diào)用了 getInfo() 方法。輸出的結(jié)果如下:
喵!大家好!我叫小白,我今年2歲了,我愛(ài)吃魚(yú)。如果子類中創(chuàng)建了一個(gè)成員變量,而該變量的類型和名稱都與父類中的同名成員變量相同,我們則稱作變量隱藏。
總結(jié)
- 上一篇: 1.7 方法重载
- 下一篇: 1.9 多态性:什么是多态?