非静态方法无法从静态上下文引用问题求助(圆形计算程序)
解决"non-static method cannot be referenced from a static context"错误
我来帮你搞定这个问题!你遇到的错误核心原因很明确:你直接用类名Circle去调用了它的非静态方法,而这些方法是属于具体的Circle对象实例的,不是类本身的静态方法,必须通过你创建的对象(也就是circle1)来调用。另外你的Circle类构造函数还有个小bug,没正确使用传入的直径参数,我一起帮你修正了。
首先修正Circle类的构造函数
原来的构造函数把直径硬编码成1了,完全没用到传入的dia参数,这会导致你初始化圆的时候直径永远是1,这显然不对:
public class Circle { private double diameter; // 修正构造函数:把传入的dia赋值给成员变量diameter public Circle(double dia) { this.diameter = dia; } public void setDiameter(double dia) { diameter = dia; } public double getDiameter() { return diameter; } public double calcPerimeter() { return 3.14 * diameter; } public double calcArea() { return 3.14 * Math.pow(diameter / 2, 2); // 用Math.pow让代码更简洁易读 } }
然后修正CircleTest类的调用方式
把所有用Circle.xxx()的地方改成用circle1.xxx(),同时可以用上你导入的DecimalFormat来格式化输出结果,让数值更美观:
import java.util.Scanner; import java.text.DecimalFormat; public class CircleTest { public static void main(String[] args) { double diameter; Scanner keyboard = new Scanner(System.in); DecimalFormat df = new DecimalFormat("#.##"); // 保留两位小数 System.out.println("Enter the diameter of the circle:"); diameter = keyboard.nextDouble(); Circle circle1 = new Circle(diameter); // 改用对象circle1调用非静态方法 System.out.println("The circle's diameter is: " + circle1.getDiameter()); System.out.println("The circle's perimeter is: " + df.format(circle1.calcPerimeter())); System.out.println("The circle's area is: " + df.format(circle1.calcArea())); keyboard.close(); // 记得关闭Scanner资源 } }
关键知识点总结
- 非静态方法/成员变量:属于类的实例对象,必须通过
对象名.方法名()的方式调用,不能直接用类名.方法名() - 构造函数的作用:是用来初始化对象的,一定要把传入的参数正确赋值给成员变量,不然初始化就失去意义了
- 可以用
Math.pow()来简化平方运算,比自己写diameter/2 * diameter/2更清晰
内容的提问来源于stack exchange,提问作者Henry Baraoidan
相关产品推荐
相关产品推荐

