【问题标题】:Why it is called runtime polymorphism?为什么叫运行时多态?
【发布时间】:2016-04-29 14:59:54
【问题描述】:

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

【问题讨论】:

  • 这是一个非常特殊的情况。如果你写A obj = getSomeA()怎么办?
  • A obj=new B() -> 在这里您明确使用了B 的实例。如果您正在调用第三方 api 并且您不知道它将返回什么类型的 Object 怎么办?例如 -List l = getAListOfSomething()
  • @TheLostMind 所以它基本上是在运行时决定的对象类型?
  • @Amol 是的。你无法预测,只有运行时才能决定:)

标签: java polymorphism


【解决方案1】:

编译器只能检查它们的类型并且它的功能是有限的。因此,它实际上无法运行并查看程序输出。这就是为什么它属于运行时。

编译器检查它的类型,运行时绑定它的功能。

【讨论】:

    【解决方案2】:

    你知道它持有 B 的引用,因为这里代码的复杂性很简单。 如果您的“C”类也从“A”类扩展而来,并且初始化 obj 的责任与其他类有关,或者可能是某些配置,该怎么办。

    不像在编译类型多态中,我们和编译器可以看到单个语句并决定可以调用哪个方法。

    【讨论】:

      【解决方案3】:

      让我们看看这个场景:

      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 say Hello!”,因为你从 Factory 的方法中得到的实例是 B 的一个实例,这取决于传递给它的 String 参数。

      在这种情况下,在运行时可能不知道将调用哪个方法(B 的 sayHello() 或 C 的 sayHello())。这就是为什么它被称为运行时多态性。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 2011-09-04
        • 1970-01-01
        • 2012-08-17
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多