同一個對象,在不同時刻表現(xiàn)出來的不同形態(tài)就叫多態(tài)
多態(tài)的形式:
有 繼承 / 實現(xiàn) 關系
有方法重寫
有父(類 / 接口)引用指向(子 / 實現(xiàn))類對象👇
//父類引用 指向 子類對象
父類 對象名 = new 子類名();
//父接口引用 指向 實現(xiàn)類對象
接口名 對象名 = new 實現(xiàn)類名();
public class Animal() {public int height = 10;
public void eat() {Sout: "動物吃東西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "貓吃魚";
}
public void play() {Sout: "貓玩老鼠";
}
}
3.1 成員變量編譯看左邊,運行看左邊 (因為成員變量沒有重寫)
javac
在編譯代碼的時候,會看左邊(父類)有沒有這個成員變量java
在運行代碼的時候,會拿左邊(父類)的成員變量的值作為最終值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
Sout: ani.height;// 輸出:10 (來自父類)
Sout: ani.weight;// 報錯,因為Animal類里沒有成員變量weight
}
}
3.2 成員方法編譯看左邊,運行看右邊 (因為成員方法有重寫)
javac
在編譯代碼的時候,會看左邊(父類)有沒有這個成員方法java
在運行代碼的時候,會拿右邊(子類)的成員方法作為最終值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 輸出:貓吃魚 (來自子類)
ani.play();//報錯,因為Animal類沒有成員方法play()
}
}
4 多態(tài)的利與弊
好處定義方法時,使用父類型作為參數(shù),可以接收所有的子類對象
。以后再使用的時候,只需要使用具體的子類型參與操作即可。提高了程序的擴展性
在多態(tài)形式下,右邊對象可以實現(xiàn)解耦合,便于擴展和維護。
? 如 A extends C, B extends C。C類中有一個工作:打掃衛(wèi)生。
? 起初A類對象在打掃衛(wèi)生:C c = new A();
c.work();
? 現(xiàn)在想讓B類對象去打掃衛(wèi)生,只需要改變子類對象C c = new B();
,后續(xù)所有的代碼都不需要更改。
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 輸出:貓吃魚 (來自子類)
ani.play();//報錯,因為Animal類沒有成員方法play()
}
}
class Animal() {public int height = 10;
public void eat() {Sout: "動物吃東西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "貓吃魚";
}
public void play() {Sout: "貓玩老鼠";
}
}
5 多態(tài)的轉型
5.1 向上轉型(自動類型轉換)從子到父
//向上轉型
Animal ani = new Cat();
5.2 向下轉型(強制類型轉換)從父到子
作用: 可以轉為真正的子類類型,從而調用子類獨有的功能
轉換類型與真實對象類型不一致的時候會報錯,所以:
轉型需謹慎,要加以判斷:
語法:a instanceof B
//變量a是不是B類型,如果是,返回true
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
//ani是不是貓類型?是就轉型,不是就不轉
if(ani instanceof Cat) {//向下轉型
Cat cat = (Cat)ani;
//此時就可以用子類的特有功能
cat.play();
} else {System.out.println("沒有該類型,無法轉換");
}
}
}
關于強轉前的判斷,jdk14以后有新特性:
語法:a instanceof B b
? //變量a是不是B類型,如果是,則強轉為B類型,轉換后的變量名更改為b;如果不是不強轉,結果為false
if(ani instanceof Cat cat) {cat.play();
} else {System.out.println("沒有該類型,無法轉換");
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧