多型 簡單講解

小劉新鮮事兒發表於2020-11-15

物件的轉型

  • 父類的引用可以指向子類的物件

  • 向上轉型:

  1. 由子類型別轉型為父類型別
  2. 可定會成功,是一個隱式轉換
  3. 向上轉型後的物件,將只能訪問父類中共有的成員,不能訪問子類獨有的成員
  • 向下轉型:
  1. 由父類型別轉型為子類型別
  2. 存在失敗的可能性,需要進行強制型別的轉換,是一個顯式轉換
  3. 如果失敗了,會出現ClassCastException異常
  4. 向下轉型後的物件,將可以訪問子類獨有的成員
Animal.java
package myOO5.polymorphism.polymorphism1;
/**
 * 物件的轉型
 */
public class Animal {}
class Dog extends Animal{}
class JinMao extends Dog{}


Program.java
package myOO5.polymorphism.polymorphism1;
/**
 *  父類的引用可以指向子類的物件
 *
 *  向上轉型:
 *      1. 由子類型別轉型為父類型別
 *      2. 可定會成功,是一個隱式轉換
 *      3. 向上轉型後的物件,將只能訪問父類中共有的成員,不能訪問子類獨有的成員
 *
 *  向下轉型:
 *      1. 由父類型別轉型為子類型別
 *      2. 存在失敗的可能性,需要進行強制型別的轉換,是一個顯式轉換
 *      3. 如果失敗了,會出現ClassCastException異常
 *      4. 向下轉型後的物件,將可以訪問子類獨有的成員
 */
public class Program {
    public static void main(String[] args) {
        Dog dog = new Dog();
        // 1. 向上轉型
        Animal animal = dog;
        // 2. 向下轉型
        JinMao jinmao = (JinMao) dog;
    }
}

報錯如下:

Exception in thread "main" java.lang.ClassCastException: myOO5.polymorphism.polymorphism1.Dog cannot be cast to myOO5.polymorphism.polymorphism1.JinMao
	at myOO5.polymorphism.polymorphism1.Program.main(Program.java:20)

原因在於dog原本就不是jinmao
在這裡插入圖片描述
修改:
在這裡插入圖片描述
instanceof 關鍵字

向下轉型,存在失敗的可能性。如果引用實際指向的物件,不是要轉型的型別,此時強制轉換會出現ClassCastException異常。所以,在向下轉型之前,最好使用 instanceof 關鍵字進行型別檢查,檢查某一個物件是不是指定的型別

物件的轉型例項

動物園例項

package myOO5.polymorphism.polymorphism2;

public class Program {
    // 需求:
    // 某動物園需要錄入動物資訊
    // 錄入的資訊,包含動物的名字,年齡;如果是老虎,還需要額外的錄入老虎的性別
    public static void main(String[] args) {
        load(new Tiger());
        load(new Monkey());
        load(new Wolf());
    }

    public static void load(Animal animal) {
        // 輸出每一個動物的姓名和年齡
        System.out.println("name = "+animal.name+", age = "+animal.age);

        // 針對老虎做特殊處理
        if (animal instanceof Tiger){
            //向下轉型
            Tiger tiger = (Tiger) animal;
            //輸出老虎的性別
            System.out.println("老虎的性別:" + tiger.gender);
        }
    }
}

class Animal{
    String name;
    int age;
}

class Tiger extends Animal{
    String gender;
}

class Wolf extends Animal{}
class Monkey extends Animal{}
class Lion extends Animal{}
class QQ extends Animal{}

多型中的方法重寫

當向上轉型後的物件,呼叫父類中的方法。如果這個方法已經被子類重寫了,此時呼叫的就是子類的重寫實現

package myOO5.polymorphism.polymorphism3;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.bark();                  //bark~

        Dog dog = new Dog();
        dog.bark();                     //Won~

        Animal animal1 = new Dog();
        animal1.bark();                 //Won~
    }
}

class Animal{
    public void bark(){
        System.out.println("bark~");
    }
}

class Dog extends Animal{
    @Override
    public void bark() {
        System.out.println("Won~");
    }
}

class Cat extends Animal{
    @Override
    public void bark() {
        System.out.println("Miao~");
    }
}

在這裡插入圖片描述

package myOO5.polymorphism.polymorphism3;

public class Test {
    public static void main(String[] args) {
        makeBark(new Animal());
        makeBark(new Dog());
        makeBark(new Cat());
    }

    private static void makeBark(Animal animal){
        animal.bark();
    }
}

class Animal{
    public void bark(){
        System.out.println("bark~");
    }
}

class Dog extends Animal{
    @Override
    public void bark() {
        System.out.println("Won~");
    }
}

class Cat extends Animal{
    @Override
    public void bark() {
        System.out.println("Miao~");
    }
}

在這裡插入圖片描述
多型重寫的案例

package myOO5.polymorphism.polymorphism2;

public class Program {
    // 需求:
    // 某動物園需要錄入動物資訊
    // 錄入的資訊,包含動物的名字,年齡;如果是老虎,還需要額外的錄入老虎的性
    public static void main(String[] args) {
        load(new Animal());
        load(new Tiger());
        load(new Monkey());
        load(new Wolf());
    }

    public static void load(Animal animal) {
        System.out.println(animal);
    }
}

class Animal{
    String name;
    int age;

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

class Tiger extends Animal{
    String gender;

    @Override
    public String toString() {
        return "Tiger{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

class Wolf extends Animal{}
class Monkey extends Animal{}
class Lion extends Animal{}
class QQ extends Animal{}

在這裡插入圖片描述
這就是重寫方法在多型中的體現

相關文章