多态
大约 3 分钟
多态:允许不同类的对象对同一消息做出不同的响应
- 可以借由向上转型和动态绑定机制完成
- 向上转型实现了将子类对象向上转型为父类类型
- 动态绑定机制能识别出对象转型前的类型,从而自动调用该类的方法
分类
- 编译时多态:又称设计时多态,通过方法重载实现
- 运行时多态:程序运行时动态决定调用哪个方法,Java 中指的多态一般指的就是运行时多态
必要条件
- 满足继承关系
- 父类引用指向子类对象
向上转型
语法:
父类类型 父类引用 = new 子类类型(参数)
又称隐式转型、自动转型
父类引用指向子类实例,也表示子类对象可以赋值给父类的对象
只能调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法
是安全的,因为任何子类都继承并接受了父类的非私有成员方法
应用场景:多适用于有多个同父子类共同应用的场景,此时,可以借由父类引用,根据实际需要,转型为特定的子类对象实现多态
// Person
public class Person {
public void eat() {
System.out.println("是人就要吃饭");
}
}
// Chinese
public class Chinese extends Person{
public void eat() {
System.out.println("中国人爱吃饺子");
}
}
// French
public class French extends Person{
public void eat() {
System.out.println("法国人爱喝香槟");
}
}
// Russian
public class Russian extends Person{
public void eat() {
System.out.println("俄国人爱吃列巴");
}
}
// Test
public class Test {
public void eat(Person person) {
person.eat();
}
public static void main(String[] args) {
Test test = new Test();
test.eat(new Person());
test.eat(new Chinese());
test.eat(new French());
test.eat(new Russian());
}
}
向下转型
- 在某些资料中也被叫做 强制类型转换
- 必须转换为原始类型,不允许转换成非原始类型
- 将子类的引用指向父类对象,此处必须进行强制类型转换
- 可以调用子类独有的方法
- 使用场景:一般用来重新获得因为向上转型而丢失的子类特性而存在,因此通常向下转型前需要先进行向上转型,向下转型通常也会结合
instanceof
一起应用,在灵活运用多态的基础上,同时兼顾子类的独有性,相较于直接创建子类实例,提高了代码的灵活性
Animal animal = new Cat();
Cat car = (Cat)animal;
绑定机制
- 将一个方法调用同一个方法所在的类连接到一起,Java 中存在静态绑定和动态绑定。
- 静态绑定:指在程序运行之前进行绑定(由编译器和链接程序完成的),也叫前期绑定
- 动态绑定:指在程序运行期间由 JVM 根据对象的类型自动的判断应该调用哪个方法,也叫后期绑定
instanceof
判断左边对象是否是右边类型的实例
if(one instanceof Cat){}