大白话聊聊多态

231 阅读2分钟

前言

在最近复习 Java 八股文的过程中,一直对面向对象的多态处于一知半解的状态。于是参考了 Stack Overflow、掘金、b站、菜鸟教程等网站,想用大白话的方式来解释多态,同时加强自己的理解。

多态的概念

文字上理解

从文字上理解,多态这个词可以被扩展成为 多种状态

抽象来说,是同一个行为在不同的条件下,产生了不同的行为。

举个例子:同样是点击鼠标右键,在 moba 游戏里是控制移动,在射击游戏里是射击。同一个行为(点击鼠标右键),在不同条件(游戏不同),产生了不同的行为。

编程上理解

编程方面来说,是同一个接口,在传入的实例不同时,执行不同的操作。

举个例子:

  1. 创建父类方法
// 父类,点击鼠标右键
class ClickRightButton {
    public void click() {
        System.out.println("You've clicked the right button.");
    }
}
  1. 创建子类
class MOBA extends ClickRightButton {
    @Override
    public void click() {
        // 子类的行为不同
        System.out.println("You've taken a few steps.");
    }
}

class FPS extends ClickRightButton {
    @Override
    public void click() {
        // 子类的行为不同
        System.out.println("You‘ve shot something.");
    }
}
  1. 使用父类类型的引用指向子类对象
public class Main {
    public static void main(String[] args) {
        // 使用基类类型的引用指向派生类对象
        ClickRightButton moveMOBA = new MOBA();
        ClickRightButton moveFPS = new FPS();

        // 调用同一个方法
        moveMOBA.click();
        moveFPS.click();
        return;
    }
}
  1. 调用同一个方法,产生不同的行为

image.png

需要注意的点

使用父类类型的引用指向子类对象

有的地方也称为 使用基类类型的引用指向派生类对象。

这是我在学习中觉得不好理解的点,对应的是下面的代码:

 ClickRightButton moveMOBA = new MOBA();
 ClickRightButton moveFPS = new FPS();

概念的解释是:

是指创建一个基类类型的变量(引用),然后用它来引用(指向)一个派生类(子类)的对象

前置知识:

Java 里面都是通过引用来操作对象的,比如:

Letter a = new Letter();

new Letter()是创建了一个 Letter 类的对象,在用 Letter 类型的变量 a 去引用刚刚创建的对象。

拆分来理解是 :

创建了一个父类类型的变量(这里的 moveMOBA 和 moveFPS)

引用子类的对象(new MOBA()/new FPS())

多态的前提

根据上面的例子,可以得到多态的前提是:

  1. 存在继承关系
  2. 存在方法重写
  3. 使用基类类型的引用指向派生类对象