
本文详解如何为 Circle 类设计 add(Circle other) 方法,使其将当前圆与另一圆的面积相加,并更新自身半径为等效新圆的半径,支持链式调用,符合面向对象的可变性设计规范。
本文详解如何为 circle 类设计 `add(circle other)` 方法,使其将当前圆与另一圆的面积相加,并更新自身半径为等效新圆的半径,支持链式调用,符合面向对象的可变性设计规范。
在几何建模或图形计算中,有时需要将多个圆形区域“合并”为一个等效圆——即新圆的面积等于原若干圆面积之和。这并非简单的半径相加(r₁ + r₂),而是需严格遵循面积守恒原则:
新圆面积 = 原圆₁面积 + 原圆₂面积 ⇒ π·r₃² = π·r₁² + π·r₂² ⇒ r₃ = √(r₁² + r₂²)
因此,add 方法的核心逻辑是:接收另一个 Circle 对象,计算二者面积之和,反推对应的新半径,并就地更新当前实例的 radius 字段,最后返回 this 以支持链式调用(如 c1.add(c2).add(c3))。
以下是符合要求的完整、正确实现:
public class Circle {
private double radius;
private static final double PI = Math.PI; // 使用 static final 更合理:π 是类级常量
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
/**
* 将当前圆与参数圆的面积相加,并更新当前圆的半径为等效新圆的半径。
* 本方法修改当前对象状态(mutable design),返回 this 实现链式调用。
*
* @param other 待合并的 Circle 对象(不可为 null)
* @return 当前 Circle 实例(this)
*/
public Circle add(Circle other) {
if (other == null) {
throw new IllegalArgumentException("Cannot add null circle");
}
double sumOfSquares = this.radius * this.radius + other.radius * other.radius;
this.radius = Math.sqrt(sumOfSquares);
return this; // 关键:返回 this,支撑 c1.add(c2).add(c3)
}
}✅ 关键设计要点说明:
- 返回类型必须是 Circle(而非 void 或 double):题干示例中 c1.add(c2).add(c3) 要求方法返回 Circle 实例,否则链式调用语法不成立;原答案中 return this.radius 是严重错误(类型不匹配且破坏链式)。
- 无需显式使用 PI 计算:如数学推导所示,π 在等式中被约去,直接计算 √(r₁² + r₂²) 即可,更高效且避免浮点冗余运算。
- 字段应设为 private:封装性是基础,radius 不应公开暴露;PI 宜声明为 static final,体现其全局常量本质。
- 健壮性增强:添加 null 检查,防止运行时异常,符合生产级代码实践。
? 验证行为(对照题干 TestCircle 输出):
初始:c1.radius = 3.5, c2.radius = 6.8, c3.radius = 12.9
执行 c1.add(c2).add(c3) 后:
→ 第一次 add(c2):c1.radius = √(3.5² + 6.8²) ≈ √(12.25 + 46.24) = √58.49 ≈ 7.648
→ 第二次 add(c3):c1.radius = √(7.648² + 12.9²) ≈ √(58.49 + 166.41) = √224.9 ≈ 14.997
结果与预期输出 14.996666296213968 高度一致(浮点精度差异可忽略)。
? 总结:add 方法的本质是“面积导向的半径合成”,它体现了数学建模到代码实现的精准映射。正确实现需紧扣三点:语义准确(面积叠加)、封装安全(private 字段)、接口友好(返回 this 支持链式)。避免陷入“参数名像 double”的误解——方法签名 add(Circle circle) 明确表明参数类型是引用对象,而非原始数值。










