MST

星途 面试题库

面试题:Java抽象类设计中的方法抽象与继承关系

在Java中,假设有一个抽象类`Shape`,包含抽象方法`calculateArea`。现在有`Circle`和`Rectangle`两个子类继承自`Shape`。请设计这几个类,并说明如何在子类中合理实现`calculateArea`方法,同时阐述设计过程中如何遵循抽象类的设计原则以保证代码的扩展性和灵活性。
47.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 类设计

// 抽象类Shape
abstract class Shape {
    // 抽象方法calculateArea
    abstract double calculateArea();
}

// Circle子类
class Circle extends Shape {
    private double radius;

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

    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

// Rectangle子类
class Rectangle extends Shape {
    private double width;
    private double height;

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

    @Override
    double calculateArea() {
        return width * height;
    }
}

2. 实现calculateArea方法

  • Circle子类中,根据圆的面积公式S = πr²,在calculateArea方法中返回Math.PI * radius * radius
  • Rectangle子类中,根据矩形的面积公式S = 长×宽,在calculateArea方法中返回width * height

3. 遵循抽象类设计原则保证扩展性和灵活性

  • 单一职责原则Shape抽象类只负责定义与形状相关的通用行为(即计算面积的抽象方法),不涉及具体形状的细节。每个子类CircleRectangle只负责实现自己特定形状的面积计算逻辑,职责清晰。
  • 开闭原则:当需要添加新的形状(如三角形)时,只需要创建一个新的子类继承自Shape,并实现calculateArea方法,而不需要修改Shape类及其现有子类的代码,保证了代码的扩展性。
  • 依赖倒置原则:高层模块(如使用这些形状类的业务逻辑代码)不依赖于低层模块(具体的形状实现类),而是依赖于抽象类Shape。这样当具体的形状实现发生变化时,高层模块的代码不需要修改,提高了代码的灵活性。