多態(polymorphism)同一個引用類型,使用不同的實例而執行不同的操作的現象叫做多態。多態表現為一個特定的引用變量指向不同類型的對象,也表現為同一個方法有多種不同的實現方式。
多態存在的條件:
- 有繼承關系
- 有方法重寫
- 父類引用指向子類對象
示例:
class Animal {//定義父類
void eat(){
System.out.println("動物在吃");
}
}
class Dog extends Animal{//繼承父類
void eat(){ //重寫方法
System.out.println("狗狗在吃肉");
}
}
class Cat extends Animal{//繼承父類
void eat(){//重寫方法
System.out.println("小貓在吃魚");
}
}
class AnimalTest{
public static void main(String[] args) {
Animal animal;
animal = new Dog(); //父類引用指向子類對象
animal.eat(); //調用的是子類中重寫過的方法
animal = new Cat();
animal.eat();
}
}
使用多態的好處:
- 對已存在的代碼具有可替換性
- 對代碼具有可擴充性
- 多態是父類向子類提供了一個共同接口,由子類來具體實現
- 使代碼更加靈活,效率更高
- 簡化了代碼的編寫和修改過程
向上轉型
子類向父類的轉換稱為向上轉型。
語法格式為 <父類型><引用變量名> = new <子類型>( );
例如: Animal animal = new Dog( );
,父類引用指向子類對象。
- 此時通過父類引用調用的方法是子類中重寫過的父類的方法,不是父類的方法。
- 此時通過父類引用無法調用子類特有的方法。(這個引用是父類類型)
向下轉型
父類向子類的轉換稱為向下轉型。
語法格式為 <子類型><引用變量名> = (子類型)<父類型引用變量名>;
例如: Dog dog = (Dog)animal;
,如果要調用Dog類中特有的方法,要把animal強制轉為Dog類型。
在向下轉型的過程中,如果不是轉換為真實的子類類型,會出現轉換異常。這里要用instancof進行類型的判斷。
Animal animal = new Dog( );
Cat cat = (Cat)animal; //會出現轉換異常,因為animal不是Cat類型
if(animal instanceof Dog){//判斷一下類型
Dog dog = (Dog)animal;
}
多態的應用形式
使用父類作為方法的形參
//在上面的代碼中加入一個Host類
class Host{
void feedAnimal(Animal animal){ //父類作為方法的形參
animal.eat();
}
}
class AnimalTest{
public static void main(String[] args) {
Host host = new Host();
Animal animal;
animal = new Dog();
host.feedAnimal(animal); //實際傳入的是子類類型
animal = new Cat();
host.feedAnimal(animal);
}
}
使用父類作為方法的返回值
class Host{
Animal sendAnimal(String type){ //父類作為方法的返回值
Animal animal = null;
if(type == "dog"){
animal = new Dog();
}else if(type == "cat"){
animal = new Cat();
}
return animal;
}
}
class AnimalTest{
public static void main(String[] args) {
Host host = new Host();
Animal animal;
animal = host.sendAnimal("dog");
animal.eat();
animal = host.sendAnimal("cat");
animal.eat();
}
}