【发布时间】:2012-01-11 10:59:19
【问题描述】:
我确实知道覆盖和重载之间的语法差异。而且我也知道覆盖是运行时多态性,而重载是编译时多态性。但我的问题是:“重载真的是编译时多态吗?方法调用真的在编译时解决吗?”。为了澄清我的观点,让我们考虑一个示例类。
public class Greeter {
public void greetMe() {
System.out.println("Hello");
}
public void greetMe(String name) {
System.out.println("Hello " + name);
}
public void wishLuck() {
System.out.println("Good Luck");
}
}
由于greetMe(), greetMe(String name), wishLuck() 的所有方法都是公共的,它们都可以被覆盖(包括重载的),对吧?例如,
public class FancyGreeter extends Greeter {
public void greetMe() {
System.out.println("***********");
System.out.println("* Hello *");
System.out.println("***********");
}
}
现在,考虑以下 sn-p:
Greeter greeter = GreeterFactory.getRandomGreeter();
greeter.greetMe();
getRandomGreeter() 方法返回一个随机的Greeter 对象。它可以返回Greeter 或其任何子类的对象,如FancyGreeter 或GraphicalGreeter 或任何其他对象。 getRandomGreeter() 将使用new 创建对象或动态加载类文件并使用反射(我认为反射是可能的)或任何其他可能的方式创建对象。 Greeter 的所有这些方法可能会或可能不会在子类中被覆盖。所以编译器无法知道某个特定的方法(重载与否)是否被覆盖。正确的?此外,维基百科在Virtual functions 上说:
在 Java 中,所有非静态方法默认都是“虚拟函数”。 只有用关键字final标记的方法,不能被覆盖, 与非继承的私有方法一起,是非虚拟的。
由于虚函数是在运行时使用动态方法分派解决的,并且由于所有非私有、非最终方法都是虚拟的(无论是否重载),它们必须在运行时解决。对吧?
那么,如何在编译时解决重载问题?或者,有什么我误解了,或者我遗漏了什么?
【问题讨论】:
标签: java polymorphism overloading overriding method-dispatch