多型
override
在Animal類別可以看到一個bark function,就現實生活的例子來看,每一種動物都有牠的叫聲,但是每種動物的叫聲都各不相同,要怎麼讓處理這種狀況?我們可以使用override
我們可以override父類別的bark function,將貓叫聲改成喵,狗叫聲改成汪
class Dog extends Animal{
@Override
public void bark(){
System.out.println("汪");
}
public void GetNewsPaper(){}
public void CatchFrisbee(){}
}
class Cat extends Animal{
@Override
public void bark(){
System.out.println("喵");
}
public void LickingFur(){}
}
@Override標籤可加可不加,但是加了之後編譯器會幫你判斷,你有沒有正確完成了override,同時也是在提醒其他工程師,這是一個override的function
現在我們來看看再次呼叫bark這個function會與一開始有什麼差異呢?
public class MainClass {
public static void main(String[] args) {
Dog myDog=new Dog();
myDog.GetNewsPaper();
myDog.bark();
}
}
------------------------------
汪
使用狗物件列印出來的叫聲將會是"汪"
super
若我們使用了override的方法,覆蓋掉了本來的bark() function,但後來我們又需要本來的bark(),這時候應該要怎麼辦呢?
使用super關鍵字,就可以呼叫父類別本先定義好的建構子或是方法。
class Dog extends Animal{
@Override
public void bark(){
System.out.println("汪");
}
public void bark_Old(){
super.bark();
}
public void GetNewsPaper(){}
public void CatchFrisbee(){}
}
可以看到我們新增了一個function,裡面呼叫了父類別的bark()
public class MainClass {
public static void main(String[] args) {
Dog myDog=new Dog();
myDog.bark();
myDog.bark_Old();
}
}
------------------------------
汪
bark
這樣就可以同時使用到沒被override前的function,以及被override後的function了
防止被override的方法: final
當我們有一個function並不想要被子類別給override的話,可以加上final標籤
過去的課有解釋過final的定義,基本上觀念是一樣的
class Cat extends Animal{
@Override
public void bark(){
System.out.println("喵");
}
public final void LickingFur(){}
}