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
相关产品推荐
相关产品推荐

