Java球体面积体积计算程序显示面积为0,求变量作用域问题排查
问题分析:球体/圆面积、体积计算程序显示0的原因及修复方案
看起来你确实戳中了问题的核心——变量作用域和对象生命周期的问题,不过还有几个对象初始化的坑导致程序输出0。咱们一步步拆解问题,再给你修复方案:
问题根源拆解
- 未初始化关键变量
r:主函数里创建了Area和Volume对象,但从来没调用gdata()方法输入半径,所以r默认是0.0,计算出来的面积、体积自然都是0。 - 方法内重新创建新对象,导致计算和打印的不是同一个实例:比如在
Area.display()里,你新建了一个Area obj,调用它的calculate(),但打印的却是当前this对象的area——这两个对象完全独立,新对象的计算结果根本没用到,而当前对象的r还是0。Volume.display()也是同样的错误。 - 小细节:类型不匹配:
r是double类型,你用nextFloat()赋值,虽然Java会自动转换,但用nextDouble()更贴合类型定义。
修复后的代码
我尽量保留你原有的类结构,只修正核心问题:
import java.util.*; class Data { double r; public void gdata() { System.out.println("Enter Radius"); Scanner s = new Scanner(System.in); r = s.nextDouble(); // 改成nextDouble匹配double类型 } } class Area extends Data { double area; public void calculate() { area = r * r * 3.14; } public void display() { // 不要新建对象,直接用当前对象的计算结果 calculate(); System.out.println("Area of Circle= " + area); } } class Volume extends Area { final double pi = 3.141; double v; public void calculate() { v = (4 * r * r * r * pi) / 3; } public void display() { // 同样不要新建对象,用当前实例的r来计算 calculate(); System.out.println("Volume of Sphere= " + v); } } class Postlab { public static void main(String args[]) { Area obj1 = new Area(); Volume obj2 = new Volume(); // 直接用Volume类型更清晰,原写法也可但不够直观 // 先输入半径!这步必须有 obj1.gdata(); // 让面积和体积共用同一个半径,避免重复输入 obj2.r = obj1.r; obj1.display(); obj2.display(); } }
修复说明
- 移除方法内的新对象创建:
display()方法里直接调用当前对象的calculate(),这样计算的是已经输入过半径的实例的结果,打印的也是当前实例的area/v。 - 添加半径初始化步骤:主函数里必须调用
gdata()(或者手动赋值r),让r有实际值,而不是默认的0。 - 优化类型匹配:把
nextFloat()改成nextDouble(),符合r的double类型定义。
这样运行程序后,输入半径就能得到正确的面积和体积了。
内容的提问来源于stack exchange,提问作者Rohit Nair
相关产品推荐
相关产品推荐

