前言
在最近复习 Java 八股文的过程中,一直对面向对象的多态处于一知半解的状态。于是参考了 Stack Overflow、掘金、b站、菜鸟教程等网站,想用大白话的方式来解释多态,同时加强自己的理解。
多态的概念
文字上理解
从文字上理解,多态这个词可以被扩展成为 多种状态 。
抽象来说,是同一个行为在不同的条件下,产生了不同的行为。
举个例子:同样是点击鼠标右键,在 moba 游戏里是控制移动,在射击游戏里是射击。同一个行为(点击鼠标右键),在不同条件(游戏不同),产生了不同的行为。
编程上理解
编程方面来说,是同一个接口,在传入的实例不同时,执行不同的操作。
举个例子:
- 创建父类方法
// 父类,点击鼠标右键
class ClickRightButton {
public void click() {
System.out.println("You've clicked the right button.");
}
}
- 创建子类
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.");
}
}
- 使用父类类型的引用指向子类对象
public class Main {
public static void main(String[] args) {
// 使用基类类型的引用指向派生类对象
ClickRightButton moveMOBA = new MOBA();
ClickRightButton moveFPS = new FPS();
// 调用同一个方法
moveMOBA.click();
moveFPS.click();
return;
}
}
- 调用同一个方法,产生不同的行为
需要注意的点
使用父类类型的引用指向子类对象
有的地方也称为 使用基类类型的引用指向派生类对象。
这是我在学习中觉得不好理解的点,对应的是下面的代码:
ClickRightButton moveMOBA = new MOBA();
ClickRightButton moveFPS = new FPS();
概念的解释是:
是指创建一个基类类型的变量(引用),然后用它来引用(指向)一个派生类(子类)的对象
前置知识:
Java 里面都是通过引用来操作对象的,比如:
Letter a = new Letter();
new Letter()是创建了一个 Letter 类的对象,在用 Letter 类型的变量 a 去引用刚刚创建的对象。
拆分来理解是 :
创建了一个父类类型的变量(这里的 moveMOBA 和 moveFPS)
引用子类的对象(new MOBA()/new FPS())
多态的前提
根据上面的例子,可以得到多态的前提是:
- 存在继承关系
- 存在方法重写
- 使用基类类型的引用指向派生类对象