首页 > 解决方案 > 如何知道它是编译时多态还是运行时多态?

问题描述

考虑一个超类:

class superclass
{
    public void fun() {.....}
}

它是子类:

class subclass extends superclass
{
    public void fun(){.......}
    public static void main()
    {
         superclass sup1=new superclass(); 
         sup1.fun()//statement 1
         superclass sup2=new subclass();
         sup2.fun() //statement 2
         subclass sub1=new subclass(); 
         sub1.fun()//statement 3
     }
}

我按照以下方式确定语句 1,2 和 3 是编译时多态还是运行时多态:

问题1:我想知道这种做法是对还是错?

问题 2:当使用返回对象地址的函数调用语句代替引用变量时,过程会是什么?我认为返回地址的函数的返回类型将用于确定多态的类型。我对么?

标签: javapolymorphismoverridinglate-bindingrun-time-polymorphism

解决方案


在 Java 中,任何可覆盖的方法总是具有运行时多态性!编译器不能知道一个类的所有可能的派生,所以它不能遵循你上面的算法。

AFAIK,逻辑是这样的:

  1. 在编译时,编译器使用变量的类型确定正确的签名。
  2. 在运行时,jvm 使用实际对象的类型和编译时确定的签名来确定正确的方法。

推荐阅读