所以我以为我了解包装,但事实却并非如此。


包中的类:我具有以下文件夹结构:mypackage/mysubpackage。在mysubpackage文件夹中,我有2个类:

package mypackage.mysubpackage;

public class Class1 {...}





    package mypackage.mysubpackage;

    public class Class2 {...}


但是,当我在目录javac Class1.java中使用mypackage/mysubpackage编译Class1(使用Class2中的方法)时,看不到Class2:

Class1.java: error: cannot find symbol
    Class2 c = new Class2();
    ^
symbol:   class Class2
location: class Class1


如果我在包含javac Class1.java的目录中运行mypackage/mysubpackage,它会很好地工作。编译不应该在mysubpackage文件夹中进行吗?


另一个包中的类:现在,我有了另一个类,该类中的方法我希望所有子包都可以使用,因此我在Commons.java内创建了一个最终的mypackage/commons

package mypackage.commons;

public final class Commons {

    public static double method() {...}
    ...
}



然后更新导入该类的Class2,以便可以在类中使用其方法:

    package mypackage.mysubpackage;

    import mypackage.commons.*;

    public class Class2 {...}


现在找不到在最终类中定义的方法:

./mypackage/mysubpackage/Class2.java: error: cannot find symbol
        double var = method();
                        ^
symbol:   method method()
location: class Class2


如果找不到,就不应该吗?我想我正确地导入了它,方法是静态的,类是最终的。为什么不识别它?

干杯!

最佳答案

看起来问题出在从命令行启动Java编译器时在哪里设置工作目录。

我建议您选择一个集成的开发环境-Eclipse is a good one。使用IDE,您不会遇到任何此类问题。这是我刚刚在Eclipse中创建的可编译相关性的类。

公地

package com.example.packagecommons;

public class Commons {

     public static double method() {
        return 0;}
}


1类

package com.example.packages;

public class Class1 {
    private Class2 c2;
    public Class1() {
        c2 = new Class2();
    }
}


2类

package com.example.packages;

import com.example.packagecommons.Commons;
public class Class2 {
    private double initialValue;
    public Class2() {
        initialValue = Commons.method();
    }
    public double getValue() {
        return initialValue;
    }
}

07-27 13:33