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

时间:2018-03-17 12:54:39

标签: java polymorphism dynamictype

我正在学习cs61b Berkeley开放课程,并对这个问题感到困惑(问题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

1 个答案:

答案 0 :(得分:0)

练习的目的是测试你对使用静态和动态类型进行方法调度的理解。

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

  • 需要调用哪种方法DogCorgi
  • 如果是Corgi的方法,则需要调用哪个重载。

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

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

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