多态的概述、多态的形式
什么是多态?
-
多态的常见形式
父类类型 对象名称 = new 子类构造器
接口 对象名称 = new 实现类构造器多态中成员访问特点
方法调用:编译看左边,运行看右边
- 变量调用:编译看左边,运行也是看左边(多态注重行为多态)
例子:父类动物类
public class Animal {
public void run(){
System.out.println("动物跑");
}
子类 狗类和猫类重写了父类的方法
public class cat extends Animal{
@Override
public void run() {
System.out.println("🐱跑");
}
}
public class dog extends Animal{
@Override
public void run() {
System.out.println("🐕跑");
}
}
测试
public static void main(String[] args) {
Animal animal = new cat();
animal.run();
Animal animal2 = new dog();
animal2.run();
}
运行结果
可以通过getclass()方法,查看真正的运行类型,结果是,运行类型都是cat合dog就是子类的类型
结论:多态表现出,同一种类型,执行同一种行为不同的表现形式。
多态的好处
优势:
在多态的形式下,右边对象可以实现解耦合,便于维护和拓展
Animal a = new dog();
a.run();//后续业务行为随对象而变,后续代码无需改变定义方法的时候,使用父类类型作为参数,该方法就可以接收这父类的一切对象了,体现出多态性的扩展性和遍历性
public static void go(Aminal a){
a.run();
}
多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)
- 此时必须进行强制类型转换:子类 对象变量=(子类)父类类型的变量。
- 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
- 注意:如果转型后的类型和对象真实类型不是同一类型,那么在强转的时候就会出现ClassCastException
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换。