實現多態的兩種方式
一、什么是多態?
父類類型的變量指向子類創建的對象,使用該變量調用父類中一個被子類重寫的方法,則父類中的方法呈現出不同的行為特征,這就是多態。
簡單的來說編譯時方法行為表現的是父類中的方法,運行時方法行為表現的是子類中重寫該方法的行為特征
二、為什么使用多態?
1、實現代碼的復用,避免代碼的冗余;
2、減少代碼之間的關聯性,即耦合度,方便后期對代碼的修改,功能的改善,不必牽一發而動全身,減少不必要的麻煩;
3、能夠通過重寫子類的方法,使不同的對像具有不同的功能,擴展了功能。
3、舉例說明
//哺乳類
piublic class Mammal
public void move(){
System.out.println("會移動!");
}
}
//鯨魚類
public class Whale extends Mammal{
public void move() {
System.out.println("靠魚鰭移動!");
}
}
//蝙蝠類
public class Bat extends Mammal{
public void move() {
System.out.println("靠翼移動!");
}
}
//如果有很多個哺乳類動物的話,每一次都要重新定義一個move方法,很麻煩且代碼冗余影響運行的速度
public class Main{
public static void main(String[] args) {
Whale whale = new Whale();
whale.move();
Bat bat = new Bat();
bat.move();
}
}
//我們可以這樣修改
public class Main{
public static void main(String[] args) {
Mammal mammal1 = new Whale();//使用上轉型每次只需要重寫子類的方法就可以,不需要重新定義方法
Mammal mammal2 = new Bat();
mammal1.move();
mammal2.move();
}
}
三、多態的實現方式
1、上轉型對象實現多態
1.1、上轉型對象與下轉型對象
上轉型對象:子類創建的對象賦值給父類聲明變量,則該對象稱為上轉型對象,這個過程稱為對象上轉型,對應於 數據類型轉換中的自動類型轉換;
下轉型對象:上轉型對象再強制轉換為創建該對象的子類類型的對象,即將上轉型對象還原為子類對象,對應於數 據類型轉換中的強制類型轉換。
注意:①上轉型對象才能夠對象下轉型;
public class Test {
public static void main(String[] args) {
Mammal mammal = new Whale();//下轉型對象
Whale whale =(Whale) mammal;//下轉型對象,還原為鯨魚類
}
}
②上轉型對象不能操作子類新增的成員變量,不能調用子類新增的方法,因此如果要使用子類新增的屬性 必須下轉型
1.2、上轉型對象實現多態實例
//哺乳類(父類)
public class Mammal{
public void move(){
System.out.println("移動");
}
}
//鯨魚類(繼承自哺乳類)
public class Whale extends Mammal{
public void move(){
System.out.println("靠魚鰭移動");
}
}
//測試類
public class Test {
public static void main(String[] args) {
Mammal mammal = new Whale();//上轉型對象,父類類型的變量指向子類聲明的對象
mammal.move();
}
}
運行結果:運行結果表現出來的是Mammal里move方法的行為特征,編譯時表現為父類的move方法的行為特征 ,多種行為狀態,即為 多態
2、接口回調實現多態
2.1、什么是接口回調?
接口回調描述的是一種現象:接口聲明的變量指向其實現類實例化的對象,那么該接口變量就可以調用接口中的抽象方法,
編譯時方法行為表現的是接口中的抽象方法,運行時方法行為表現的是接口實現類中重寫該方法的行為特征,即為多態
2.2、接口回調實現多態實例
//接口
public interface IMammal {
void move();
}
public class Whale implements IMammal{
public void move(){
System.out.println("靠魚鰭移動");
}
}
public class Test {
public static void main(String[] args) {
IMammal mammal = new Whale();
mammal.move();
}
}
運行結果:編譯時是接口的行為特征,運行時是接口實現類的行為特征
3、接口回調與上轉型對象實現多態的區別與聯系
①上轉型對象多態的父類是普通類,接口回調都是父類是接口;
②接口回調父類方法更加的簡潔,是抽象方法不需要有方法體;
③都是編譯時顯示父類方法行為特征,運行時顯示子類行為特征。
---------------------