java - 如何从Java中的main调用非静态方法?

标签 java methods program-entry-point static

我一直在为我的计算机科学入门类(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/

相关文章:

java - 数组中的表达式错误开始非法

eclipse - Eclipse 中 JRE 系统库中的断点

java - 带有 h2 嵌入式数据库的 MySQL LONGTEXT

java - 如何在没有 web 容器的情况下加载 spring

java - 主要方法如何工作?

c++ - 接受整数或字符串的方法。 C++

c# - 如何在 C# 中做标志

testing - 如何在 Rust 的实现中测试方法

java - 错误 : Could not find or load main class Main when trying to run JAR. list 和类路径看起来不错,但仍然不起作用?

来自构造函数的 C# 字符串未传递给表单