代码之家  ›  专栏  ›  技术社区  ›  Greg. O Hajdu

Java多文件和文件夹层次结构

  •  -1
  • Greg. O Hajdu  · 技术社区  · 8 年前

    我有多个Java文件,其中一个(Demo)是大多数函数所在的位置,Demoest1是main所在的位置。 我尝试打包演示文件并在其他文件中使用该包,但当我使用终端(javac…)编译时,DemoTest1不编译,因为它还有一个包含参数的函数,返回的值是演示文件的对象。

    演示。java文件:

    package xyz.mypackage;
    
    class  Demo{
        private  double val1;
        private  double val2;
    
        private void  setValues(double num1, double num2){
            val1 = num1;
            val2 = num2;
        }
        private double getValue1(){
            return (this.val1);
        }
        private double getValue2(){
            return (this.val2);
        }
        private double  getAverage(){
           return((this.val1 + this.val2) / 2);
        }
    
        public Demo(double double1, double double2){
            this.val1 = double1;
            this.val2 = double2;
        }
    
        static void decrDemo(Demo obj){
            obj.setValues(obj.val1 - 1, obj.val2 - 1);
        }
    }
    

    降级1。java文件:

    import java.util.Scanner; 
    import xyz.mypackage.Demo;
    
    public class DemoTest1{
        static Demo addDemo(Demo obj1, Demo obj2){
            return new Demo(obj1.getValue1() + obj2.getValue1(), obj1.getValue2() + obj2.getValue2());
        }
    
        static void incrDemo(Demo obj){
            obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
        }
    
        public static void main(){
            Demo item = Demo();
    
            System.out.printl("\nPlease enter 2 numbers: ");
            Scanner input = new Scanner(System.in);
            double val1 = input.nextDouble();
            double val2 = input.nextDouble();
            demo.setValues(val1, val2);
    
            System.out.printl("\nThe average of the two values entered is: " + item.getAverage());
    
            Demo obj1 = new Demo(5, 7),
                 obj2 = new Demo(14, 9);
    
            Demo objR = addDemo(obj1, obj2);
    
            incrDemo(obj1);
    
            System.out.printl("\nobjR has the following values. val1: &d\tval2: &d", objR.getValue1(), objR.getValue2());
            System.out.printl("\nobj1 has the following values. val1: &d\tval2: &d", obj1.getValue1(), obj1.getValue2());
        }
    }
    

    错误输出:

    Air:Project xyz$ javac Demo.java DemoTest1.java
    DemoTest1.java:2: xyz.mypackage.Demo is not public in xyz.mypackage;     
    cannot be accessed from outside package
    import xyz.mypackage.Demo;
                        ^
    ./Demo.java:3: duplicate class: xyz.mypackage.Demo
    class  Demo
    ^
    DemoTest1.java:6: cannot access Demo
    bad class file: ./Demo.java
    file does not contain class Demo
    Please remove or make sure it appears in the correct subdirectory of    
    the classpath.
    static Demo addDemo(Demo obj1, Demo obj2)
    

    如果我按照正确的说明操作,它应该会运行,但我想DemoTest1中并没有包含演示,因为我使用了打包,所以我不理解DemoTest1。或者我是否需要以不同于使用javac的方式编译文件。。然后用java运行Demoest1?

    编辑: 更改文件夹层次结构和修复语法错误使其成功编译,但在尝试运行它(java DemoTest1)时,我发现:

    Exception in thread "main" java.lang.NoSuchMethodError: main  
    

    编辑2: 异常已修复。虽然main()足够了,但它需要main(字符串args[])。 现在,它工作得很完美,正如预期的那样。感谢您的帮助和学习机会!

    解决方案: 对于任何寻找类似问题的人。我写了xyz。mypackage在使用包时,它必须位于这些文件夹/子文件夹中(我认为,它本身就是包的常规语法,无论文件夹如何),还必须添加默认构造函数,因为我添加了一个特殊构造函数,我错误地认为,如果没有参数,它将只使用常规构造函数。 除了一些小的语法错误(没有正确使用println或使用%d而不是&f等)之外,另一个问题是main()不能为空,它需要有一个参数(字符串args[])。

    3 回复  |  直到 6 年前
        1
  •  1
  •   CoolMandy    8 年前

    您需要声明演示类 作为公众 。如果您可以检查错误,它会明确提到相同的错误。

        2
  •  0
  •   Jose Da Silva Gomes Tarsbir Singh    8 年前
    import java.util.Scanner; 
    
    public class DemoTest1 {
        static Demo addDemo(Demo obj1, Demo obj2) {
            return new Demo(obj1.getValue1() + obj2.getValue1(), 
                    obj1.getValue2() + obj2.getValue2());
        }
    
        static void incrDemo(Demo obj) {
            obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
        }
    
        public static void main(String args[]) {
            Demo item = new Demo(0, 0);
    
            System.out.println("\nPlease enter 2 numbers: ");
            Scanner input = new Scanner(System.in);
            double val1 = input.nextDouble();
            double val2 = input.nextDouble();
            item.setValues(val1, val2);
    
            System.out.println("\nThe average of the two values entered is: " 
                    + item.getAverage());
    
            Demo obj1 = new Demo(5, 7);
            Demo obj2 = new Demo(14, 9);
    
            Demo objR = addDemo(obj1, obj2);
    
            incrDemo(obj1);
    
            System.out.printf("\nobjR has the following values. val1: %.2f\tval2: %.2f", 
                    objR.getValue1(), objR.getValue2());
            System.out.printf("\nobj1 has the following values. val1: %.2f\tval2: %.2f", 
                    obj1.getValue1(), obj1.getValue2());
        }
    }
    

    演示类很好,但这样试试应该可以。测试类中有一些语法错误。叫一个替身 %.2f 对于小数点后两位的双精度,而不是您所拥有的。此外,您不需要将它们放入新的包或类似的东西中。

        3
  •  0
  •   Jrod24    8 年前

    我认为这里可能有一些问题:

    在DemoTest1中,您应该更改

    import xyz.mypackage.Demo;
    

    import xyz.mypackage.Demo.*;
    

    demo.setValues(val1, val2);
    

     item.setValues(val1, val2);
    

    在演示中,您应该更改

    class  Demo
    

    public class Demo
    

    并添加默认构造函数,因为您在DemoTest1文件中引用了一个

    类似于

    public Demo() {
        val1 = 0.0
        val2 = 0.0
    }