天天看點

Java知識【多态】

目錄

​​1,多态​​

​​1.1:多态的概述(記憶)​​

​​1.2:多态中的成員通路特點(記憶)​​

1,多态

1.1:多态的概述(記憶)

  • 什麼是多态

    同一個對象,在不同時刻表現出來的不同形态

  • 多态的前提
  • 要有繼承或實作關系
  • 要有方法的重寫
  • 要有父類引用指向子類對象
  • 代碼示範
class Animal {
    public void eat(){
        System.out.println("動物吃飯");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }
}

public class Test1Polymorphic {
    /*
        多态的前提:

            1. 要有(繼承 \ 實作)關系
            2. 要有方法重寫
            3. 要有父類引用, 指向子類對象
     */
    public static void main(String[] args) {
        // 目前事物, 是一隻貓
        Cat c = new Cat();
        // 目前事物, 是一隻動物
        Animal a = new Cat();
        a.eat();

    }
}      

1.2:多态中的成員通路特點(記憶)

  • 成員通路特點
  • 成員變量

    編譯看父類,運作看父類

  • 成員方法

    編譯看父類,運作看子類

  • 代碼示範
class Fu {
    int num = 10;

    public void method(){
        System.out.println("Fu.. method");
    }
}

class Zi extends Fu {
    int num = 20;

    public void method(){
        System.out.println("Zi.. method");
    }
}

public class Test2Polymorpic {
    /*
         多态的成員通路特點:

                成員變量: 編譯看左邊 (父類), 運作看左邊 (父類)

                成員方法: 編譯看左邊 (父類), 運作看右邊 (子類)
     */
    public static void main(String[] args) {
        Fu f = new Zi();
        System.out.println(f.num);
        f.method();
    }
}      

1.3:多态的好處和弊端(記憶)

  • 好處

    提高程式的擴充性。定義方法時候,使用父類型作為參數,在使用的時候,使用具體的子類型參與操作

  • 弊端

    不能使用子類的特有成員

1.4:多态中的轉型(應用)

  • 向上轉型

    父類引用指向子類對象就是向上轉型

  • 向下轉型

    格式:子類型 對象名 = (子類型)父類引用;

  • 代碼示範
class Fu {
    public void show(){
        System.out.println("Fu..show...");
    }
}

class Zi extends Fu {
    @Override
    public void show() {
        System.out.println("Zi..show...");
    }

    public void method(){
        System.out.println("我是子類特有的方法, method");
    }
}

public class Test3Polymorpic {
    public static void main(String[] args) {
        // 1. 向上轉型 : 父類引用指向子類對象
        Fu f = new Zi();
        f.show();
        // 多态的弊端: 不能調用子類特有的成員
        // f.method();

        // A: 直接建立子類對象
        // B: 向下轉型

        // 2. 向下轉型 : 從父類類型, 轉換回子類類型
        Zi z = (Zi) f;
        z.method();
    }
}      

1.5:多種中轉型存在的風險和解決方案(應用)

  • 風險

    如果被轉的引用類型變量,對應的實際類型和目标類型不是同一種類型,那麼在轉換的時候就會出現ClassCastException

  • 解決方案
  • 關鍵字

    instanceof

  • 使用格式

    變量名 instanceof 類型

    通俗的了解:判斷關鍵字左邊的變量,是否是右邊的類型,傳回boolean類型結果

  • 代碼示範
abstract class Animal {
    public abstract void eat();
}

class Dog extends Animal {
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void watchHome(){
        System.out.println("看家");
    }
}

class Cat extends Animal {
    public void eat() {
        System.out.println("貓吃魚");
    }
}

public class Test4Polymorpic {
    public static void main(String[] args) {
        useAnimal(new Dog());
        useAnimal(new Cat());
    }

    public static void useAnimal(Animal a){  // Animal a = new Dog();
                                             // Animal a = new Cat();
        a.eat();
        //a.watchHome();

//        Dog dog = (Dog) a;
//        dog.watchHome();  // ClassCastException  類型轉換異常
      
        // 判斷a變量記錄的類型, 是否是Dog
        if(a instanceof Dog){
            Dog dog = (Dog) a;
            dog.watchHome();
        }
    }

}