Java多态性分类总结笔记
一、多态性概述
Java多态性:对象多态与行为多态的定义解析
对象多态(编译时多态/静态多态)
定义:
对象多态是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表不同(类型、顺序或数量不同)。编译器在编译时根据方法签名(方法名+参数列表)来确定具体调用哪个方法,因此也称为编译时多态或静态多态。
核心特征:
- 实现方式:通过方法重载(Overload)实现
- 绑定时机:编译时确定
- 发生范围:同一个类内部
- 判断依据:根据调用时传入的参数类型和数量
关键点:
- 方法名必须相同
- 参数列表必须不同(参数类型、数量或顺序)
- 与返回值类型无关(不能仅通过返回类型不同来重载方法)
- 可以有不同的访问修饰符和抛出异常
- 是编译时的静态绑定
行为多态(运行时多态/动态多态)
定义:
行为多态是指在继承关系中,子类可以重写(Override)父类的方法,当通过父类引用调用该方法时,实际执行的是子类重写后的方法。具体执行哪个方法是在运行时根据实际对象类型决定的,因此也称为运行时多态或动态多态。
核心特征:
- 实现方式:通过方法重写(Override)实现
- 绑定时机:运行时确定
- 发生范围:存在继承关系的类之间
- 判断依据:根据运行时对象的实际类型
关键点:
- 方法名、参数列表和返回类型必须完全相同
- 子类方法的访问权限不能比父类更严格
- 子类方法抛出的异常不能比父类更宽泛
- 静态方法不能被重写(会被隐藏)
- private/final方法不能被重写
- 是运行时的动态绑定
本质区别对比
维度 | 对象多态 | 行为多态 |
---|---|---|
多态主体 | 同一类中的多个方法 | 不同类中的同一方法 |
实现机制 | 方法重载(Overload) | 方法重写(Override) |
绑定时机 | 编译时 | 运行时 |
判断依据 | 方法签名(参数列表) | 对象实际类型 |
关系范围 | 同一个类内部 | 继承关系的类之间 |
典型应用 | 提供多种参数形式的同一功能 | 实现接口的统一调用不同实现 |
记忆技巧
-
对象多态:
- 记住"一个类,多个方法"
- 编译时就知道调用哪个方法(看参数)
- 典型表现:方法重载
-
行为多态:
- 记住"一个方法,多种实现"
- 运行时才知道具体执行哪个实现(看对象)
- 典型表现:方法重写
专业术语解释
- 静态绑定(早期绑定):
在编译时就能确定方法调用的具体版本,如对象多态中的方法重载。 - 动态绑定(晚期绑定):
在运行时根据实际对象类型确定方法调用的具体版本,如行为多态中的方法重写。
理解这两种多态的区别,是掌握Java面向对象编程核心思想的关键之一。对象多态提高了方法的灵活性,行为多态则实现了程序的可扩展性。
多态性是面向对象编程的三大特性之一,指同一操作作用于不同对象时,可以有不同的解释和执行结果。
二、多态性分类
1. 对象多态(编译时多态/静态多态)
特点:
- 在编译时确定
- 主要通过方法重载(Overload)实现
- 也称为静态多态或早期绑定
实现方式:
- 方法重载(Overload)
- 同一类中多个同名方法
- 参数列表不同(类型、顺序、数量)
- 与返回值类型无关
示例:
class Calculator {
// 方法重载示例
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
2. 行为多态(运行时多态/动态多态)
特点:
- 在运行时确定
- 主要通过方法重写(Override)实现
- 也称为动态多态或晚期绑定
- 需要继承关系
实现方式:
- 方法重写(Override)
- 子类重写父类方法
- 方法名、参数列表、返回值类型必须相同
- 访问权限不能比父类更严格
示例:
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵喵");
}
}
三、两种多态对比
特性 | 对象多态(编译时多态) | 行为多态(运行时多态) |
---|---|---|
绑定时间 | 编译时 | 运行时 |
实现机制 | 方法重载(Overload) | 方法重写(Override) |
关系 | 同一类中 | 继承关系中 |
决定因素 | 参数列表 | 实际对象类型 |
性能 | 效率高 | 效率略低(需运行时确定) |
灵活性 | 较低 | 较高 |
四、多态性应用场景
-
对象多态应用:
- 提供多种处理同一功能的不同方式
- 简化API设计,统一方法名
-
行为多态应用:
- 实现接口编程
- 框架设计中的扩展点
- 实现设计模式(如策略模式、工厂模式等)
五、注意事项
-
对象多态(重载):
- 不能仅通过返回值类型区分重载方法
- 可变参数方法可能引起重载歧义
-
行为多态(重写):
- 静态方法不能被重写(隐藏而非重写)
- private/final方法不能被重写
- 子类方法抛出的异常不能比父类更宽泛