为什么它被称为运行时多态?

时间:2016-04-29 05:12:21

标签: java polymorphism

我正在扩展一个类,但我无法弄清楚为什么 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));
    }     
}

3 个答案:

答案 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())。这就是它被称为运行时多态性的原因。

因为决定是在运行时做出的。