下面是一个简单的Java示例,显示了多态:重载和覆盖。
多态性意味着函数在不同的时间呈现不同的形式。 编译时间称为函数重载。 重载允许通过使用通用名称来访问相关的方法。 它有时被称为ad hoc多态性,而不是参数多态性。
class A {
public void M(int i){
System.out.println("int");
}
public void M(String s){
//this is an overloading method
System.out.println("string");
}
}
class B extends A{
public void M(int i){
//this is overriding method
System.out.println("overriden int");
}
}
public static void main(String[] args) {
A a = new A();
a.M(1);
a.M("abc");
A b = new B();
b.M(1234);
}
从编译器的角度来看,如何为正确的函数调用生成代码?
静态重载不难实现。 在处理重载函数的声明时,新的绑定会将其映射到不同的实现。 在类型检查过程中,编译器分析参数的实际类型以确定使用哪个函数。
动态重载允许在实际参数的运行时类型上选择函数的不同实现。 这是一种动态调度的形式。
动态调度也被用来实现方法覆盖。 重写的方法由运行时的实际对象类型决定。
为了理解动态调度,在内存中有一个关于对象布局的文章。