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

标签 java polymorphism dynamictype

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

c.play(d);    // Method D is called

所以在这种情况下d静态类型为Dog和动态类型 Corgi ,在编译时Method D被记录了,那么为什么在运行时它仍然调用 Method D而不是Method E基于其动态类型?

最佳答案

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

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

  • 需要调用 DogCorgi 的方法,以及
  • 对于 Corgi 的方法,需要调用哪个重载。

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

编译器只关心c的静态类型:它需要确保采用Dogplay方法在运行时可用。虚拟调用本身由 JVM 根据 c 对象的动态类型执行。

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

关于Java参数具有不同的静态和动态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49336247/

相关文章:

java - java中有没有类似于swift的dynamicType的关键字

java - 每次鼠标单击时的单独操作

ruby-on-rails - Rails 4.2.6 + 多态 + Carrierwave 0.10 + 条件

java - 为了验证而重写变异方法

objective-c - Swift - 获取对具有相同名称但不同参数的函数的引用

java - java中动态定义集合或对象类型变量

java - 如何使用维基数据工具包 api 提取人类可读的数据?

java - 如何按值遍历 Map 以及如果值相同则按键对它们进行排序?

java - 如何使用 GridLayout 中的特定元素?

c - 取决于调试级别的函数多态性