多态
多态的定义
- 基本定义:多态通俗来说就是多种形态,具体表现为去完成某个行为时,当不同的对象去完成时会产生出不同的状态。在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口。
- 专业解释:多态类型(Polymorphic Type)可以将自身所支持的操作套用到其它类型的值上。在程序运行时,相同的消息可能会发送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,从而产生不同的行为。
多态的分类
- 变量多态:基类型的变量(如C++中的引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。
- 函数多态:相同的函数调用界面(函数名与实参表),传送给一个对象变量时,可以有不同的行为,这取决于该对象变量所指向的对象类型。
- 动态多态:通过类继承机制和虚函数机制生效于运行期,可以优雅地处理异质对象集合。
- 静态多态:基于模板的多态,处理于编译期而非运行期,如C++中的模板和函数重载。
为什么要使用多态
- 可替换性:子类对象可以随时替代父类对象,向上转型。
- 可扩展性:通过添加新的子类,可以扩展系统的功能。
- 接口统一性:可以通过父类类型的引用访问子类对象的方法,统一对象的接口。
- 代码的灵活性和可维护性:通过多态,可以将代码编写成通用的、松耦合的形式,提高代码的可维护性。
多态的机制原理
动态绑定
动态绑定(Dynamic Binding):指的是在编译时,Java 编译器只能知道变量的声明类型,而无法确定其实际的对象类型。而在运行时,Java 虚拟机(JVM)会通过动态绑定来解析实际对象的类型。这意味着,编译器会推迟方法的绑定(即方法的具体调用)到运行时。正是这种动态绑定机制,使得多态成为可能。
虚拟方法调用
虚拟方法调用(Virtual Method Invocation):在 Java 中,所有的非私有、非静态和非 final 方法都是被隐式地指定为虚拟方法。虚拟方法调用是在运行时根据实际对象的类型来确定要调用的方法的机制。当通过父类类型的引用变量调用被子类重写的方法时,虚拟机会根据实际对象的类型来确定要调用的方法版本,而不是根据引用变量的声明类型。