首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同静态和动态类型的Java参数?

具有不同静态和动态类型的Java参数?
EN

Stack Overflow用户
提问于 2018-03-17 12:54:39
回答 1查看 529关注 0票数 1

我正在学习cs61b伯克利公开课,我对这个问题感到困惑(问题1,第7行):https://sp18.datastructur.es/materials/discussion/examprep04sol.pdf

代码语言:javascript
复制
c.play(d);    // Method D is called

因此,在这种情况下,d有静态类型的Dog和动态类型的Corgi,在编译时Method D被记录下来,那么为什么在运行时它仍然根据动态类型调用Method D而不是Method E

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-17 13:09:49

本练习的目的是测试您对使用静态和动态类型进行方法分派的理解。

在您的情况下,Java编译器必须做出两个决定:

  • 它的方法,Dog的或Corgi的,需要调用,并且
  • 对于Corgi的方法,需要调用重载。

第一个决定是基于调用表达式c.play(d)的左侧,即c,即Corgi。如果进一步将Corgi子类划分为CardiganPembroke,则将根据动态类型在运行时调用相应子类的方法。

编译器只关注静态类型的c:它需要确保在运行时使用play方法获取Dog。虚拟调用本身由JVM根据c对象的动态类型执行。

第二个需要调用重载的决定也是在编译时完成的。这一点很重要,因为它在编译时“锁定”决策。这就是为什么正确的答案是"D",尽管对象d具有动态类型的Corgi

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

https://stackoverflow.com/questions/49336247

复制
相关文章

相似问题

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