我知道重写和重载之间的语法差异。我也知道重写是运行时多态,而重载是编译时多态。但我的问题是:“重载真的是编译时多态吗?方法调用是否真的在编译时解决?” 为了澄清我的观点,让我们考虑一个示例类。
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("***********");
}
}
现在,考虑以下代码片段:
Greeter greeter = GreeterFactory.getRandomGreeter();
greeter.greetMe();
getRandomGreeter()
方法返回一个随机的Greeter
对象。它可能返回Greeter
的对象,也可能返回其任何子类(例如FancyGreeter
或GraphicalGreeter
或其他任何一个)。getRandomGreeter()
将使用new
关键字创建对象,或者动态加载类文件并使用反射来创建对象(我认为使用反射是可能的),或者使用其他任何可能的方式创建对象。这些Greeter
的所有方法都可能被子类覆盖或不被覆盖。因此,编译器无法知道特定方法(重载或非重载)是否被覆盖。对吗?此外,维基百科在虚函数中提到:
在Java中,所有非静态方法默认都是“虚函数”。 除了标有关键字final(不能被覆盖)的方法以及私有方法(无法继承)之外,所有非私有、非final方法都是虚方法。
由于虚函数在运行时使用动态方法分派进行解析,而所有非私有、非final方法都是虚函数(无论是否重载),因此它们必须在运行时解析。对吗?
那么,如何在编译时仍然解决重载?或者,有什么我误解的地方或者我遗漏了什么?
greeter.greetMe(strAsObj);
打印出 Hello String?换句话说,有没有一种方法可以实现运行时多态性? - tejasvi88