我一直在为我的计算机科学入门类(class)设计一个实验室,但遇到了这个问题:
根据说明,我必须拥有回答特定问题的每个方法(例如:问题 5.9,方法是 FivePointNine(),并且必须在 main 中由另一个类 (Assignment6.main) 调用。我的问题是 main是静态的,而我需要为实验室调用的 final方法是非静态的,因此它不允许我编译和运行。我遇到的三个错误与 multiSphere(x) 有关。具体错误是“Cannot make a对类型Assignment6 中的非静态方法“multiSphere(double)”的静态引用。”
public class Assignment6
{
public Sphere newSphere = new Sphere();
public Assignment6 A6 = new Assignment6();
public static int x;
public static void main(String[] args)
{
x = 2 + (int)(Math.random() * ((10 - 2) + 1));
multiSphere(x);
x = 2 + (int)(Math.random() * ((10 - 2) + 1));
multiSphere(x);
x = 2 + (int)(Math.random() * ((10 - 2) + 1));
multiSphere(x);
}
public void multiSphere(double diameter)
{
Sphere.inputDiameter(diameter);
Sphere.volumeCalc(diameter);
Sphere.surfaceAreaCalc(diameter);
toString();
}
public String toString()
{
return "The diameter of this sphere is " + Sphere.inputDiameter(x) + ", the volume is " + Sphere.volumeCalc(x) + ", and the surface area is " + Sphere.surfaceAreaCalc(x) + ". ";
}
我的第二个类称为 Sphere,如下所示:
public class Sphere
{
public Assignment6 newA6 = new Assignment6();
public static double volume;
public static double surfaceArea;
public static double inputDiameter(double diameter)
{
return diameter;
}
public static double volumeCalc(double diameter)
{
// Volume = (4.0/3.0)(pi)(r)^3
volume = (4.0/3.0) * (Math.PI) * Math.pow((diameter/2.0), 3);
return volume;
}
public static double surfaceAreaCalc(double diameter)
{
// Surface area = (4)(pi)(r)^2
surfaceArea = (4) * (Math.PI) * (Math.pow((diameter/2.0), 2));
return surfaceArea;
}
}
我不太确定如何在 main 方法中调用 multiSphere(x) 而不会遇到我遇到的错误。我觉得我错过了一些如此简单的事情。
最佳答案
这里发生了很多事情需要快速纠正——尤其是 final 即将到来。
首先,您需要了解 Sphere
类应该如何工作。 Sphere
的每个实例都是它自己的事物并且知道如何做事。球体需要给出的只是它的直径(或半径),这样它就可以计算出它需要的关于自身的所有信息。它可以计算它的体积和表面积,并且可以在 toString
中打印出来。
所以你希望Sphere
看起来像这样:
public class Sphere {
public double diameter;
public Sphere(double diameter) {
this.diameter = diameter;
}
public double volume() {
return (4.0 / 3.0) * (Math.PI) * Math.pow((diameter / 2.0), 3);
}
public double surfaceArea() {
return (4) * (Math.PI) * (Math.pow((diameter / 2.0), 2));
}
public String toString()
{
return "The diameter of this sphere is " + diameter + ", the volume is " + volume() + ", and the surface area is " + surfaceArea() + ". ";
}
}
请注意 Sphere
如何具有构造函数,这就是我们创建 Sphere
新实例的方式。我们只用直径来做到这一点。一旦有了它,Sphere
的实例就可以完成 Sphere
所做的一切。
还请注意,没有静态
。我不知道你为什么这么喜欢static
。
您应该知道静态
任何内容都意味着该类的每个实例都共享它。这不适用于球体
,因为每个实例都有其自己的直径。它不像一堆球体
共享一个直径。有些可能具有相同的直径,但它们仍然是自己的。这就像你和我可以驾驶宾利汽车(一厢情愿的想法),它们在各方面都相同,但它们仍然是两辆不同的汽车。当然,static
事物无法访问非static
事物,因为非static
事物需要成为对象实例的一部分,而对象实例可能不是可用。
最后,在主类 Assignment6
中,您只需执行以下操作:
Sphere s = new Sphere(5);
创建一个直径为 5 的 Sphere
实例。现在 s
可以通过 toString
告诉我们它的体积、表面积及其描述>.
我实际上不确定您的任务是什么,但希望这会对您有所帮助。
关于java - 如何从Java中的main调用非静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342589/