首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道它是编译时多态还是运行时多态?

如何知道它是编译时多态还是运行时多态?
EN

Stack Overflow用户
提问于 2018-11-05 06:23:17
回答 2查看 128关注 0票数 0

考虑一个超类:

代码语言:javascript
复制
class superclass
{
    public void fun() {.....}
}

它是子类:

代码语言:javascript
复制
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)语句1将导致运行时多态性。 2)语句2还将导致运行时多态性。 3)语句3将导致编译时多态性。

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

问题2:如果使用函数调用语句代替引用变量,返回对象的入口,那么将是什么过程?我认为返回入口的函数的返回类型将用于确定多态性的类型。我说得对吗?

EN

回答 2

Stack Overflow用户

发布于 2018-11-05 07:26:27

在Java中,对于任何可重写的方法,您总是具有运行时多态性!编译器不能知道类的所有可能派生,所以不能遵循上面的算法。

AFAIK,逻辑如下:

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

Stack Overflow用户

发布于 2018-11-05 07:50:52

我认为所有语句都是java中的运行时多态性,每个非静态方法在运行时绑定。对象在运行时引用,因此在编译时不存在任何对象,所以当您在将运行时绑定的对象的帮助下调用任何方法时,总是这样。在这里,代码函数是由对象调用的,这所有语句都是运行时多态,另一件事是函数重写将始终是运行时多态,因为引用在运行时会外泄到对象,但是函数重载可能是在运行时,或者在编译时,当您重载将在运行时进行绑定的非静态函数时,或者当您重载静态memeber时,只有该函数才会在编译时绑定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53149311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档