Java 多態

Java 多態

多態

  • 概念
    • 對象在不同時刻表現出來的不同狀態
  • 多態的前提

    1. 要有繼承或者實現關係

    2. 要有方法的重寫

    3. 要有父類引用指向子類對象

  • 程序中的體現

    • 父類或者接口的引用指向或者接收自己的子類對象
  • 好處和作用

    • 多態的存在提高了程序的擴展性和後期的可維護性
  • 弊端

    • 父類調用的時候只能調用父類的方法,不能調用子類的特有方法,因爲你並不清楚將來會有什麼樣子的子類繼承你。
  • 多態的成員特點

    • 成員變量

      • 編譯時期:看引用型變量所屬的類中是否有所調用的變量;

      • 運行時期:也是看引用型變量所屬的類中是否有調用的變量。

      • 簡單記:編譯和運行都看等號左邊

    • 成員方法

      • 編譯時期:看引用型變量所屬的類中是否有所調用的成員;

      • 運行時期:看對象所屬的類中是否有調用的成員,如果父類出現同名的方法,會運行子類中的方法,因爲方法有覆蓋的特性。

      • 簡單記:編譯看左邊,運行看右邊

    • 靜態方法

      • 編譯時期:看引用型變量所屬的類中是否有所調用的變量;

      • 運行時期:也是看引用型變量所屬的類中是否有調用的變量。

      • 簡單記:編譯和運行都看等號左邊

向上轉型和向下轉型

  • 一定不能夠將父類對象轉換成子類類型

  • 父類引用指向子類對象,該引用可以被提升,也可以被強制轉換。

  • 多態自始至終都是子類對象在變化

  • 示例

    class Demo1 {
        public static void main(String[] args) {
            // 向上轉型,類型提升
            Phone p1 = new Nokia(); 
            // 向下轉型,強制將父類的引用轉換成子類類型,不能將Nokia類型轉換成MOTO或Nexus類型   
    
            Nokia no = (Nokia)p1;
            // 輸出 Phone---null---0 ;因爲繼承了父類的方法      
            no.print();                 
    
            Phone p2 = new Moto();
            Moto mo = (Moto)p2;
            // 輸出 Moto---red---1500 ;因爲重寫了父類的方法
            mo.print();                 
    
            Phone p3 = new Nexus();
            // 輸出 Nexus---red---2000
            p3.print();
        }
    }
    
    class Phone {
        String color;
        int price;
    
        public void print() {
            System.out.println("Phone---" + color + "---" + price);
        }
    }
    
    class Nokia extends Phone {
        String color = "red";
        int price = 1000;
    
        //public void print() {
        //  System.out.println("Phone---" + color + "---" + price);
        //}
    }
    
    class Moto extends Phone {
        String color = "red";
        int price = 1500;
    
        public void print() {
            System.out.println("Moto---" + color + "---" + price);
        }
    }
    
    class Nexus extends Phone {
        String color = "red";
        int price = 2000;
    
        public void print() {
            System.out.println("Nexus---" + color + "---" + price);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章