我正在学习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?
发布于 2018-03-17 13:09:49
本练习的目的是测试您对使用静态和动态类型进行方法分派的理解。
在您的情况下,Java编译器必须做出两个决定:
Dog的或Corgi的,需要调用,并且Corgi的方法,需要调用重载。第一个决定是基于调用表达式c.play(d)的左侧,即c,即Corgi。如果进一步将Corgi子类划分为Cardigan和Pembroke,则将根据动态类型在运行时调用相应子类的方法。
编译器只关注静态类型的c:它需要确保在运行时使用play方法获取Dog。虚拟调用本身由JVM根据c对象的动态类型执行。
第二个需要调用重载的决定也是在编译时完成的。这一点很重要,因为它在编译时“锁定”决策。这就是为什么正确的答案是"D",尽管对象d具有动态类型的Corgi。
https://stackoverflow.com/questions/49336247
复制相似问题