Java构造器radius参数未传递 圆属性计算全部返回0.0问题
问题原因分析
- 核心问题:CircleData类的radius成员从未被赋值
你在CircleData中虽然读取了用户输入的半径r,也创建了CircleCalculator对象传入了r,但CircleCalculator类的radius是它自己的私有属性,和CircleData类自己定义的radius变量完全是两个独立的变量,CircleData自己的radius没有被赋值,默认初始值就是0.0,后续所有面积、周长的计算都是基于这个0值,所以输出全是0。 - 额外的结构逻辑问题
- 类职责混乱:不需要同时定义CircleCalculator和CircleData两个类来处理圆的计算,结构冗余
- Scanner重复实例化:main方法里已经创建了Scanner对象,CircleData里又重复创建了新的Scanner实例,属于不必要的操作
- 访问器权限错误:get类的访问器方法定义为private,不符合封装的规范,外部类正常情况下无法调用
修正方案
你可以直接简化类结构,把所有圆的属性和计算逻辑放在同一个类里即可,修正后的代码如下:
// 导入Scanner读取键盘输入 import java.util.Scanner; class CircleCalculator { private final double pi = 3.1415; private double radius; // 构造器接收半径参数 public CircleCalculator(double r) { radius = r; } // 访问器:获取半径 public double getRadius() { return radius; } // 修改器:修改半径 public void setRadius(double r) { this.radius = r; } // 计算面积 public double getArea() { return pi * radius * radius; } // 计算直径 public double getDiameter() { return 2 * radius; } // 计算周长 public double getCircumference() { return 2 * pi * radius; } public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.println("\n欢迎来到Cam的魔法圆计算器!"); System.out.println("\n请输入圆的半径:"); double inputRadius = keyboard.nextDouble(); // 用输入的半径创建计算器对象 CircleCalculator circle = new CircleCalculator(inputRadius); System.out.println("\n半径为 " + circle.getRadius() + " 的圆的各项参数如下:\n" + "\t面积:" + circle.getArea() +" 平方单位\n" + "\t直径:" + circle.getDiameter() +" 单位\n" + "\t周长:" + circle.getCircumference() +" 单位\n"); keyboard.close(); } }
修正说明
- 把所有圆的属性、构造器、访问器、计算方法都整合到CircleCalculator一个类中,逻辑更清晰
- 构造器接收半径参数后直接赋值给当前类的radius成员,不会再出现值没有传递的问题
- 补充了setRadius修改器方法,满足修改器的使用需求
- 所有访问器方法改为public符合封装规范
- 关闭了Scanner资源避免内存泄漏
内容的提问来源于stack exchange,提问作者Cameron Brooks
相关产品推荐
相关产品推荐

