多型


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(){} 
}

results matching ""

    No results matching ""