Java 多態
多態
- 概念
- 對象在不同時刻表現出來的不同狀態
多態的前提
要有繼承或者實現關係
要有方法的重寫
要有父類引用指向子類對象
程序中的體現
- 父類或者接口的引用指向或者接收自己的子類對象
好處和作用
- 多態的存在提高了程序的擴展性和後期的可維護性
弊端
- 父類調用的時候只能調用父類的方法,不能調用子類的特有方法,因爲你並不清楚將來會有什麼樣子的子類繼承你。
多態的成員特點
成員變量
編譯時期:看引用型變量所屬的類中是否有所調用的變量;
運行時期:也是看引用型變量所屬的類中是否有調用的變量。
簡單記:編譯和運行都看等號左邊
成員方法
編譯時期:看引用型變量所屬的類中是否有所調用的成員;
運行時期:看對象所屬的類中是否有調用的成員,如果父類出現同名的方法,會運行子類中的方法,因爲方法有覆蓋的特性。
簡單記:編譯看左邊,運行看右邊
靜態方法
編譯時期:看引用型變量所屬的類中是否有所調用的變量;
運行時期:也是看引用型變量所屬的類中是否有調用的變量。
簡單記:編譯和運行都看等號左邊
向上轉型和向下轉型
一定不能夠將父類對象轉換成子類類型
父類引用指向子類對象,該引用可以被提升,也可以被強制轉換。
多態自始至終都是子類對象在變化
示例
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); } }