多态
1.多态的概念
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如下图
多态性是对象多种表现形式的体现。
现实中,比如我们按下 F1 键这个动作:
- 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
- 如果当前在 Word 下弹出的就是 Word 帮助;
- 在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
2.多态的好处
- \1. 消除类型之间的耦合关系
- \2. 可替换性
- \3. 可扩充性
- \4. 接口性
- \5. 灵活性
- \6. 简化性
3.多态的分类
- 编译时多态(静态多态):主要通过方法重载(Overloading)实现。方法重载是指在同一个类中定义多个同名方法,但这些方法的参数列表不同(参数个数、类型或顺序不同)。在编译时,Java编译器根据方法调用的参数列表确定具体调用哪个方法。
- 运行时多态(动态多态):主要通过方法重写(Overriding)和父类引用指向子类对象实现。当子类继承了父类并重写了父类中的某些方法时,通过父类引用调用这些方法时,实际执行的是子类中的方法实现。这种多态性在运行时确定,因此称为运行时多态。
4.多态的机制原理
Java中多态的机制原理主要涉及方法的重写(Overriding)和方法的动态绑定(Dynamic Binding)。多态允许一个引用变量在运行时指向多种实际类型的对象,并根据对象的实际类型调用相应的方法。以下是Java中多态机制原理的详细解释:
4.1. 方法的重写
-
定义:在子类中定义一个与父类同名、参数列表相同但方法体不同的方法,称为方法的重写。
-
作用:子类通过重写父类的方法,可以提供自己特有的实现。
-
规则
:
- 方法名、参数列表必须相同。
- 返回类型可以与父类方法相同,也可以是父类返回类型的子类型(Java 5及以后版本支持协变返回类型)。
- 访问权限不能比父类中被重写的方法的访问权限更低(但可以更高)。
- 抛出的异常不能比父类中被重写的方法声明的异常更广泛(但可以更具体或不抛出异常)。
4.2. 方法的动态绑定
-
定义:在Java中,方法的调用是在运行时根据对象的实际类型来确定的,这种机制称为方法的动态绑定(也称为晚期绑定或动态多态)。
-
原理
:
- 编译时:编译器只能根据引用变量的类型(即编译时类型)来确定可以调用哪些方法,但它无法确定具体调用哪个子类的方法。
- 运行时:当方法被调用时,JVM会根据对象的实际类型(即运行时类型)来查找并调用相应的方法实现。
-
实现:通过方法表(Method Table)来实现。每个Java对象都有一个指向方法区的指针,这个指针指向的方法区中包含该对象所属类的所有方法(包括从父类继承的方法)。当方法被调用时,JVM会根据对象的实际类型查找方法表,找到对应的方法实现并调用。
4.3. 多态的实现条件
- 继承的存在:多态基于继承,没有继承就没有多态。
- 子类重写父类的方法:子类通过重写父类的方法,提供自己特有的实现。
- 父类引用变量指向子类对象:这是多态性的具体表现,即可以通过父类类型的引用变量来调用子类对象的方法。