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

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();
 }
}

修复说明

  1. 移除方法内的新对象创建:display()方法里直接调用当前对象的calculate(),这样计算的是已经输入过半径的实例的结果,打印的也是当前实例的area/v。
  2. 添加半径初始化步骤:主函数里必须调用gdata()(或者手动赋值r),让r有实际值,而不是默认的0。
  3. 优化类型匹配:把nextFloat()改成nextDouble(),符合r的double类型定义。

这样运行程序后,输入半径就能得到正确的面积和体积了。

内容的提问来源于stack exchange,提问作者Rohit Nair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:52