1. 程式人生 > 實用技巧 >Java中多型相關知識點

Java中多型相關知識點

多型

1.多型概述

同一個物件在不同時刻表現出的不同形態

多型的前提和體現:

  • 有繼承/實現關係
  • 有方法重寫
  • 有父類引用指向子類物件(Animal a = new Cat();)

2.多型中的成員訪問特點

  • 成員變數:編譯看左邊,執行看右邊
  • 成員方法:編譯看左邊,執行也看左邊

為什麼成員變數和成員方法的訪問不一樣呢?

  • 因為成員方法有重寫,而成員變數沒有.

示例:

父類

package com.itheima_06;

public class Animal {
    public int age = 40;

    public void eat(){
        System.out.println("動物吃東西");
    }
}

子類

package com.itheima_06;

public class Cat extends Animal {
    public int age = 10;
    public int weight = 15;

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

    public void playGame(){
        System.out.println("貓捉迷藏");
    }
}

測試類

package com.itheima_06;

public class AnimalDemo {
    public static void main(String[] args) {
        //有父類引用指向子類物件
        Animal a = new Cat();

        System.out.println(a.age);
       // System.out.println(a.weight);         報錯      成員變數編譯和執行都看左邊
        a.eat();            //多型中的成員方法,編譯看左邊,執行看右邊
        //a.playGame();     報錯
    }
}

3.多型的好處和弊端

多型的好處:提高了程式的擴充套件性

集體體現:定義方法的時候,使用父型別作為引數,將來在使用時,使用具體的子型別參與操作

多型的弊端:不能使用子類的特有功能

//動物操作類
public class AnimalOperator {
    /*
        public void useAnimal(Cat c){
            c.eat();
        }

        public void useAnimal(Dog d){
            d.eat();
        }

     */
    //傳入的引數採用Animal就不用每次新建一個類就為他新定義一個方法
    public void useAnimal(Animal a) {
        //Animal a = new Cat();
        //Animal a = new Dog();
        a.eat();
    }
}
//測試類
public class AnimalDemo {
    public static void main(String[] args) {
        //建立動物操作類的物件,呼叫方法
        AnimalOperator animalOperator = new AnimalOperator();
        Cat c = new Cat();
        animalOperator.useAnimal(c);

        Dog d = new Dog();
        animalOperator.useAnimal(d);
    }
}

4.多型中的轉型

  • 向上轉型
  • 向下轉型
public class AnimalDemo {
    public static void main(String[] args) {
        //向上轉型
        Animal a = new Cat();
        a.eat();
        //不能呼叫子類的特有方法play()
        
        //向下轉型
        Cat c = (Cat)a;
        //可以呼叫子類中的特有方法play了
        c.play();
    }
}