Java中的驱动程序类/类的范围存在问题

时间:2019-02-20 22:37:23

标签: java

我制作了一个Sphere类,其中包含一些函数。然后,我制作了一个MultiSphere类,充当“驱动程序类”。我将Sphere类放在驱动程序类中(这是您应该如何使用类/驱动程序类?),现在看来我在尝试访问Sphere.diameter变量时遇到错误,因为它首先要通过Multisphere类。

我的IDE说

Multisphere.this cannot be referenced from a static context

我得到了错误

non-static variable this cannot be referenced from a static context

当我尝试在最后一行创建我的Sphere类的新实例时:

Sphere circle = new Sphere(15);

完整代码:

import java.util.Scanner;
import java.lang.Math;

public class MultiSphere {

    public class Sphere {
        // Instance Variables
        double diameter;

        // Constructor Declaration of Class
        private Sphere(double diameter) {
            this.diameter = diameter;
        }

        private double getDiameter() {
            System.out.printf("Diameter is %f \n", diameter);
            return diameter;
        }

        // Allows user to modify the diameter variable
        private double setDiameter() {
            System.out.print("Enter the diameter for the sphere: \n");
            this.diameter = new Scanner(System.in).nextDouble();
            return diameter;

        }

        private void Volume() {
            double radius = diameter / 2;
            double volume = (4 * Math.PI * Math.pow(radius, 3)) / 3;
            System.out.printf("The volume of the sphere is: %f \n", volume);

        }

        private void surfaceArea() {
            double radius = diameter / 2;
            double surfaceArea = 4 * Math.PI * Math.pow(radius, 2);
            System.out.printf("The surface area is: %f \n", surfaceArea);

        }

    }

    public static void main(String[] args) {
        System.out.printf("Hello World");
         Sphere circle = new Sphere(15);
    }
}

2 个答案:

答案 0 :(得分:1)

这里的问题是Sphere是一个非静态内部类。这意味着您需要MultiSphere的实例才能访问它:

MultiSphere ms = new MultiSphere();
Sphere s = new ms.Sphere();

或者,您可以将Sphere类设为静态:

public static class Sphere {

最后,您可以将这些类放入分别名为MultiSphere.javaSphere.java的两个文件中。就个人而言,我更喜欢这个。

答案 1 :(得分:-2)

您必须将私有范围更改为公共范围。

    private Sphere(double diameter) {
        this.diameter = diameter;
    }

喜欢

    public Sphere(double diameter) {
        this.diameter = diameter;
    }

除非您在同一个类中调用私有构造函数,否则没有意义。