创建Java包并使用它时出错

时间:2017-11-07 07:23:40

标签: java compiler-errors packages

我写了一段代码给了我一些错误,请查看并调试它:

package measurement;
import java.util.*;

class Cylinder {
    static double sa(float h,float r) { return 2*3.14*r*h; }
    static double vol(float h,float r) { return 3.14*r*r*h; }
}

class Sphere {
    static double sa(float r) { return 4*3.14*r*r; }
    static double vol(float r) { return 4/3*3.14*r*r*r; }
}

class Cube {
    static public double sa(float a) { return 6*a*a; }
    static public double vol(float a) { return a*a*a; }
}

public class Measure {
    public static void main(String arg[]) {}
    public static void cubeSA(float a) { Cube.sa(a); }
    public static void cubeVol(float a) { Cube.vol(a); }
}

上面的代码是我创建的包,但在我的其他程序中它给出了错误

  

课程测量不能访问

my main(other) program is:
import measurement.*;
import java.util.*;
public class PackExample {

    public static void main (String args[]) {
        Scanner sc=new Scanner (System.in);
        Measure m=new Measure();
        Cylinder cy=new Cylinder();
        Sphere s=new Sphere();
        while (true)
        {   System.out.println("Enter:\n1.CYLINDER\n2.CUBE3.SPHERE");
            int x=sc.nextInt();
            if(x==1)
            {
                System.out.println("Enter height of cylinder:");
                float a=sc.nextfloat();
                System.out.println("Enter radius of base of cylinder:");
                float b=sc.nextfloat();
                System.out.println("Surface area is "+cy.Cylinder.sa(a,b)+" unit sq.");
                System.out.println("Surface area is "+cy.Cylinder.vol(a,b)+" unit cube");
            }
            else if(x==2)
            {
                System.out.println("Enter its Edge length:");
                float a=sc.nextFloat();
                System.out.println("Surface area is "+m.CubeSA(a)+" unit sq.");
                System.out.println("Surface area is "+m.CubeVol(a)+" unit cube");
            }
            else if(x==3)
            {  
                System.out.println("Enter Radius of Sphere:");
                float r=sc.nextFloat();
                System.out.println("Surface area is "+s.Sphere.sa(r)+" unit sq.");
                System.out.println("Surface area is "+s.Sphere.vol(r)+" unit cube");
            }
            else System.exit(0);
        }

    }
}

虽然也必须有其他错误,但

  

错误:无法访问Measure

This is compiler error 需要先调试。

1 个答案:

答案 0 :(得分:0)

所以要有一个明确的答案,首先你应该从包和主要的同一地点获得你的编译来源。

javac ./measurement/*.java文件夹中javac PackExample.javaJavaCode。然后java PackExample运行你的主。

但是你会遇到另一个我试图向你解释的问题,一个java文件只能公开一个类,所以你将无法调用其中一个。 (见that

所以你应该为每个类创建另一个文件:

<强>测量/ Measure.java

public class Measure{
    public static void cubeSA(float a)
    { 
        Cube.sa(a);
    }

    public static void cubeVol(float a){
        Cube.vol(a);
    }
}

<强>测量/ Cylinder.java

public class Cylinder {
    static double sa(float h,float r)
    {
        return 2*3.14*r*h;
    }

    static double vol(float h,float r)
    {
        return 3.14*r*r*h;
    }
}

Etc等 ...(您不需要在每个类的包中都有一个main函数)

希望这有帮助,

为了更好的编码,我会向您解释另一件事 Interfaces Abstract classes

由于你有不同的形状都使用相同的方法,你可以使用描述形状的抽象类,例如:

public abstract class Shape {
    abstract double sa(float h, float r);
    abstract double vol(float h, float r);
}

然后你将它扩展为所有形状:

public class Cylinder extends Shape {
    private final float PI = 3.14159;

    @Override
    double sa(float h, float r)
    {
        return 2*PI*r*h;
    }

    @Override
    double vol(float h, float r)
    {
        return PI*r*r*h;
    }
}

你也应该看一下static methods,在你的情况下,你不一定需要它们。您可以通过构造函数直接将参数提供给对象。

public class Cylinder extends Shape {
    private final float PI = 3.14159;
    private final float height;
    private final float radius;

    public Cylinder(float h, float r) {
        height = h;
        radius = r;
    }

    @Override
    double sa()
    {
        return 2*PI*radius*height;
    }

    @Override
    double vol()
    {
        return PI*radius*radius*height;
    }
}

使用抽象类:

public abstract class Shape {
    abstract double sa();
    abstract double vol();
}