重写toString方法输出Shape子类属性时获0.0错误值求助
问题原因与解决方法
核心问题
你代码里的sphere_SA、sphere_Volume这些成员变量,只有在调用surface_area()、volume()方法时才会被赋值。但遍历ArrayList打印对象时,只是直接调用了toString(),并没有触发这两个计算方法,所以变量还是默认的初始值0.0。
最优解决方案
直接在toString()里调用计算方法,不要依赖成员变量存储结果。这样每次打印都会实时计算,既避免了忘记调用方法的问题,还能省去多余的成员变量。
修改后的Sphere类示例:
public class Sphere extends Shape { public double radius = 5; @Override public double surface_area() { return 4 * Math.PI * Math.pow(radius, 2); } @Override public double volume() { // 注意:4/3是整数除法,要写成4.0/3才会得到正确的小数结果 return 4.0/3 * Math.PI * Math.pow(radius, 3); } @Override public String toString() { return String.format("球体:表面积=%.2f,体积=%.2f", surface_area(), volume()); } }
额外提示
- 把
4/3改成4.0/3,否则整数除法会导致体积计算错误(结果会是1*π*r³,而不是正确的三分之四)。 - 其他形状(Cylinder、Cone)也可以照搬这个逻辑,在
toString()里直接调用对应的计算方法,就能输出正确的数值。
内容的提问来源于stack exchange,提问作者Kaleb Weikel
相关产品推荐
相关产品推荐

