MST

星途 面试题库

面试题:Java多态在接口类层次结构中的深度理解

定义一个接口Shape,包含计算面积的方法calculateArea。创建两个类Circle和Rectangle实现该接口。现在有一个方法printArea,接受一个Shape类型的数组,在方法内遍历数组并调用每个Shape实例的calculateArea方法。在主程序中,创建Circle和Rectangle的实例并填充到数组,传递给printArea方法。请阐述这种多态实现背后的原理,以及在运行时JVM是如何确定调用哪个具体实现的calculateArea方法的。
30.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 多态实现背后的原理
    • 基于继承或接口实现:在这个例子中,CircleRectangle类通过实现Shape接口,建立了一种“是一种”(is - a)的关系。它们都“是一种”Shape
    • 编译时和运行时的绑定
      • 编译时:编译器只知道变量的声明类型,例如在printArea方法中,参数是Shape类型的数组,编译器仅检查Shape接口中是否有calculateArea方法,这是静态绑定。
      • 运行时:JVM根据对象的实际类型来确定调用哪个具体实现的方法,这是动态绑定。这种机制允许程序在运行时根据对象的实际类型选择合适的方法实现,从而实现多态。
  2. JVM确定调用具体方法的过程
    • 方法表:JVM为每个类创建一个方法表。当CircleRectangle类加载到内存时,它们的方法表中会包含calculateArea方法的具体实现地址。
    • 动态绑定:在printArea方法遍历Shape数组时,JVM在运行时根据数组中每个对象的实际类型(CircleRectangle),在对应的方法表中查找calculateArea方法的地址,然后调用该方法。例如,如果数组中的某个元素实际类型是Circle,JVM就会在Circle类的方法表中找到calculateArea方法的实现并调用它;如果是Rectangle,则在Rectangle类的方法表中查找并调用相应实现。