多态(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();
}
}