多態及練習題


多態就是父類引用指向子類對象 例如Animal a = new Dog();//向上轉型

多態必須使用向下轉型的時候:當在其他類中調用子類對象中獨有的方法的時候需要向下轉型 Animal a = new Dog(); Dog d = (Dog) a;//向下轉型

多態在實際中的應用實際上就是為了程序的擴展性,OCP原則,關閉修改性,提高可擴展性,盡可能的少修改代碼

/*
測試多態
1.編寫程序實現樂手彈奏樂器。樂手可以彈奏不同的樂器從而發出不同的聲音。
可以彈奏的樂器包括二胡、鋼琴和琵琶。
    實現思路及關鍵代碼:
        1)定義樂器類Instrument,包括方法makeSound()
        2)定義樂器類的子類:二胡Erhu、鋼琴Piano和小提琴Violin
        3)定義樂手類Musician,可以彈奏各種樂器play(Instrument i)
        4)定義測試類,給樂手不同的樂器讓他彈奏
*/
public class TestMusic 
{
    public static void main(String[] args) 
    {
        Musician m = new Musician();
        Violin v = new Violin();
        m.play(v);
    }
}
class Instrument
{
    public void makeSound(){
        System.out.println("樂器發聲");
    }
}
class Erhu extends Instrument
{
    public void makeSound(){
        System.out.println("二胡在拉");
    }
}
class Piano extends Instrument
{
    public void makeSound(){
        System.out.println("彈鋼琴");
    }    
}
class Violin extends Instrument
{
    public void makeSound(){
        System.out.println("拉小題琴");
    }    
}
class Musician
{
    public void play(Instrument i){
        i.makeSound();
    }
}
/*
編寫程序模擬“主人”喂養“寵物”的場景:
提示1:
    主人類:Master
    寵物類:Pet
    寵物類子類:Dog、Cat、YingWu
提示2:
    主人應該有喂養的方法:feed()
    寵物應該有吃的方法:eat()
    只要主人喂寵物,寵物就吃。

要求:主人類中只提供一個喂養方法feed(),要求達到可以喂養各種類型的寵物。

編寫測試程序:
    創建主人對象
    創建各種寵物對象
    調用主人的喂養方法feed(),喂養不同的寵物,觀察執行結果。

通過該案例,理解多態在開發中的作用。
重要提示:feed方法是否需要一個參數,參數選什么類型!!!
*/

class Testfeed{
    public static void main(String[] args) 
    {
        //創建一個寵物對象
        Pet pet = new Pet();
        //創建一個狗對象
        Dog dog = new Dog();
        //創建一個主人對象
        Master master = new Master();
        //調用主人投喂方法
        master.feed(dog);
    }
}
class Pet{//創建寵物類讓其它類都繼承他
    public void eat(){//創建寵物吃方法
        System.out.println("動物在吃");
    }
}
class Dog extends Pet//創建狗類
{
    public void eat(){//覆蓋父類吃方法對吃方法重寫
        System.out.println("狗在吃");
    }
}
class Cat extends Pet
{
    public void eat(){
        System.out.println("貓在吃");
    }
}
class YingWu extends Pet
{
    public void eat(){
        System.out.println("鸚鵡在吃");
    }
}
class Master
{
    
    public void feed(Pet p){//此處實際上是 Pet p = new Dog();此處涉及到父類引用指向子類對象,即多態
        p.eat();//調用父類吃方法,此處為編譯器識別通過,具體調用哪個子類的吃方法還要看動態綁定的那個子類是啥
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM