我正在扩展一个类,但我无法弄清楚为什么 JVM仅在运行时决定调用哪个方法。我的意思是当我A obj=new B();
时,B
中的方法是否会被调用显然不是很明显?
也许这对编译器来说并不明显,但我想知道细节。
代码如下:
class A
{
String getName(String name) {
return "super";
}
}
class B extends A
{
@Override
String getName(String name) {
return "sub";
}
}
public class Overload
{
public static void main(String args[]) {
A obj=new B();
System.out.println(obj.getName(null));
}
}
答案 0 :(得分:0)
编译器只能检查其类型,并且它的功能有限。因此它实际上无法运行并查看程序输出。这就是为什么它属于运行时间。
编译器检查它的类型,并运行时绑定它的功能。
答案 1 :(得分:0)
你知道它有B的引用,因为这里代码的复杂性很简单。 如果你的类'C'也从'A'类扩展并且如果初始化obj的责任是与其他类或者某些配置有关,那该怎么办呢?
与编译类型多态性不同,我们以及编译器可以看到单个语句并决定可以调用哪个方法。
答案 2 :(得分:0)
让我们看看这个场景:
public abstract class A {
public abstract void sayHello();
}
public class B extends A{
public void sayHello(){
System.out.println("B says Hello!");
}
}
public class C extends A{
public void sayHello(){
System.out.println("C says Hello!");
}
}
public class FactoryA{
public static A getInstance(String type){
if("B".equals(type)){
return new B();
}
else if("C".equals(type)){
return new C();
}
}
}
让我们说现在你要求工厂根据String参数获取实例,如下所示:
A a = FactoryA.getInstance("B"); // the string can come user-input
a.sayHello();
在这个输出中将是" B表示Hello!",因为从Factory方法获得的实例是B的实例,它取决于传递给它的String参数。 / p>
在这种情况下,在运行时可能不知道将调用哪种方法(B& sayHello()或C" sayHello())。这就是它被称为运行时多态性的原因。
因为决定是在运行时做出的。