Java 多态

 2023-02-06
原文作者:蒋先森 原文地址:https://jlj98.top/

声明:如果本文有错误,希望指出。

虽然学习和使用 Java 好多年了,但是对于多态的整体概念还是有点模糊。今天在看之前写的关于反射博文时,突然想到了 Java 的三大特性——多态。其他两个分别是**封装、继承**。只是想起多态的继承、重写,对于别的有点模糊了,于是就像自己整理下。

多态

多态指的是对象的多种形态。继承是多态的实现基础。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的分类:

    public class PolymorphicCase {
    
        public static void main(String[] args) {
            show(new Cat());
            show(new Dog());
    
            //向上转型
            Animal animal = new Cat();
            animal.eat();//调用的是Cat的 eat
            //当使用多态方式调用方法时,首先检查父类中是否有该方法,
            // 如果没有,则编译错误;如果有,再去调用子类的同名方法
            animal.work();//编译报错
            //向下转型
            Cat cat = (Cat) animal;
            cat.work();//调用的是Cat的work
        }
    
        public static void show(Animal animal) {
            animal.eat();
            if (animal instanceof Cat) {
                Cat cat = (Cat) animal;
                cat.work();
            }
            if (animal instanceof Dog) {
                Dog dog = (Dog) animal;
                dog.work();
            }
        }
    }
    
    abstract class Animal {
        abstract void eat();
    }
    
    class Cat extends Animal {
    
        @Override
        void eat() {
            System.out.println("猫吃鱼....");
        }
    
        public void work() {
            System.out.println("猫抓老鼠....");
        }
    }
    
    class Dog extends Animal {
    
        @Override
        void eat() {
            System.out.println("狗吃骨头....");
        }
    
        public void work() {
            System.out.println("look door....");
        }
    }

向上转型

Animal animal = new Cat(); 对于这个对象的创建,就是体现了向上转型。

子类引用的对象转换为父类类型成为向上转型。通俗的说就是将子类对象转化为父类对象,此处对象可以是接口。

向下转型

Cat cat = (Cat) animal; 这里就是向下转型。与向上转型相对应的就是向下转型了。向下转型是把父类对象转为子类对象。

多态的实现

  • 重写
  • 接口
  • 抽象类和抽象方法

总结

多态的优点

  • 消除类型的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用子类对象

Reference