MST

星途 面试题库

面试题:Java中如何在面向接口编程里体现多态

请举例说明在Java面向接口编程时,多态是如何通过接口实现类的不同行为来体现的,至少包含两个接口实现类,并阐述其原理。
38.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 示例代码
    • 首先定义一个接口:
public interface Shape {
    double calculateArea();
}
  • 然后创建两个接口实现类:
public class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}
public class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }
}
  • 测试代码:
public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(4, 6);

        System.out.println("Circle area: " + circle.calculateArea());
        System.out.println("Rectangle area: " + rectangle.calculateArea());
    }
}
  1. 原理阐述
    • 多态的体现:在上述代码中,CircleRectangle都实现了Shape接口,它们对calculateArea方法有不同的实现。当我们使用Shape类型的变量分别指向CircleRectangle的实例时,调用calculateArea方法会根据实际对象的类型(即CircleRectangle)来执行相应的实现,从而体现出不同的行为。
    • 背后原理
      • 编译时多态:在Java中,方法调用在编译期是静态绑定的,即根据变量的声明类型来决定调用哪个方法。在Shape circle = new Circle(5);中,变量circle声明为Shape类型,编译器只知道Shape接口中有calculateArea方法。
      • 运行时多态:在运行期,Java虚拟机(JVM)会根据对象的实际类型来决定执行哪个方法。当调用circle.calculateArea()时,JVM知道circle实际指向的是Circle对象,所以会执行Circle类中重写的calculateArea方法;同理,对于rectangle.calculateArea(),会执行Rectangle类中重写的calculateArea方法。这种运行时根据对象实际类型来动态绑定方法的机制就是多态在面向接口编程中的体现。