You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承设计疑问:Square类如何仅接收单个边长参数

问题分析与解决方案

嘿,你的问题确实不全在构造器上,咱们来一步步拆解核心问题和修复方案:

1. 冗余属性引发的逻辑混乱

你在Rectangle里额外定义了side属性,这完全是多余的——Rectangle的核心就是宽(width)和高(height),Square作为它的特例,只需要保证width == height即可,根本不需要单独存一个side。同样,Square类里的side属性也是画蛇添足,重复定义会导致父类和子类的属性不一致,计算面积/周长时必然出错。

2. 构造器调用的关键错误

你的Square构造器没有调用父类Rectangle的构造器,导致父类的width和height默认是0值。当调用getArea()时,会用父类的width * height(也就是0),而不是你期望的side * side,这是最直接的问题。

正确的做法是在Square的构造器里,调用父类的双参数构造器,把边长同时传给width和height:

Square(double side) {
    super(side, side); // 让父类的宽和高都等于边长
    super.setShapeName("Square");
}

同时记得删掉Rectangle里多余的side属性和对应的get/set方法,让它专注于自身的宽高逻辑。

3. 方法重写的拼写错误

注意到你把getPerimeter写成了gerPerimeter(少了个t),这会导致子类没有正确重写父类的抽象方法,编译时肯定会报错。所有类里的这个方法都要修正为getPerimeter。

4. 接口定义的语法问题

你的Comparable接口定义有小错误,正确的泛型接口写法应该是:

interface Comparable<E> {
    boolean isLargerThan(E obj);
}

(接口方法默认是public的,不需要额外声明;同时要保证泛型参数的正确使用)

修正后的核心代码示例

修正后的Rectangle类

class Rectangle extends geometricShape {
    private double width, height;

    Rectangle(double width, double height) {
        super.setShapeName("Rectangle");
        this.width = width;
        this.height = height;
    }

    @Override
    public double getPerimeter() { // 修正拼写错误
        return 2 * (width + height);
    }

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

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}

修正后的Square类

class Square extends Rectangle {
    Square(double side) {
        super(side, side); // 调用父类构造器,同步宽高为边长
        super.setShapeName("Square");
    }

    // 可以添加专属的side方法,内部复用父类的宽高
    public double getSide() {
        return getWidth(); // 因为宽高相等,取任意一个即可
    }

    public void setSide(double side) {
        setWidth(side);
        setHeight(side); // 同时更新宽高,保证正方形特性
    }

    // 可选:禁止单独修改宽或高,强制保持正方形属性
    @Override
    public void setWidth(double width) {
        super.setWidth(width);
        super.setHeight(width);
    }

    @Override
    public void setHeight(double height) {
        super.setHeight(height);
        super.setWidth(height);
    }
}

额外小建议

  • 所有重写父类/接口的方法都加上@Override注解,能帮你快速发现拼写或参数不匹配的问题。
  • 父类geometricShape里的抽象方法也建议加上abstract关键字(你已经加了,这点很好),明确强制子类实现。

内容的提问来源于stack exchange,提问作者weeaboo trash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:23