多态的概述、多态的形式

什么是多态?

  • 同类型的对象、执行同一个行为,会表现出不同的行为特征

    多态的常见形式

    父类类型 对象名称 = new 子类构造器
    接口 对象名称 = new 实现类构造器

    多态中成员访问特点

  • 方法调用:编译看左边,运行看右边

  • 变量调用:编译看左边,运行也是看左边(多态注重行为多态)

例子:父类动物类

  1. public class Animal {
  2. public void run(){
  3. System.out.println("动物跑");
  4. }

子类 狗类和猫类重写了父类的方法

  1. public class cat extends Animal{
  2. @Override
  3. public void run() {
  4. System.out.println("🐱跑");
  5. }
  6. }
  7. public class dog extends Animal{
  8. @Override
  9. public void run() {
  10. System.out.println("🐕跑");
  11. }
  12. }

测试

  1. public static void main(String[] args) {
  2. Animal animal = new cat();
  3. animal.run();
  4. Animal animal2 = new dog();
  5. animal2.run();
  6. }

运行结果
image.png
可以通过getclass()方法,查看真正的运行类型,结果是,运行类型都是cat合dog就是子类的类型

结论:多态表现出,同一种类型,执行同一种行为不同的表现形式。
image.pngimage.png
image.png
image.png

验证了变量调用编译看左边运行看左边。

多态的好处

优势:

  • 在多态的形式下,右边对象可以实现解耦合,便于维护和拓展

    Animal a = new dog();
    a.run();//后续业务行为随对象而变,后续代码无需改变

  • 定义方法的时候,使用父类类型作为参数,该方法就可以接收这父类的一切对象了,体现出多态性的扩展性和遍历性

    1. public static void go(Aminal a){
    2. a.run();
    3. }

    多态下引用数据类型的类型转换

自动类型转换(从子到父):子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)

  • 此时必须进行强制类型转换:子类 对象变量=(子类)父类类型的变量。
  • 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
  • 注意:如果转型后的类型和对象真实类型不是同一类型,那么在强转的时候就会出现ClassCastException

image.png
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换。