包语句与 .java 文件目录之间的关系?

Relationship between a package statement and the directory of a .java file?

考虑包层次结构 folder1/hi。 folder1 包含 B.java 并且 hi 包含 A.java.

B.java:

package hi.a12.pkg;
public class B { }

A.java:

package a12.pkg;
public class A {B b; }

现在 B.java 编译成功,但是 A.java 没有。

因为两者都应在同一位置生成 class 文件。因此,他们应该能够在没有导入语句的情况下找到彼此。

但它仍然说 class B 未找到。

有人建议采取措施......或者出了什么问题......

Consider a package hierarchy folder1/hi. folder1 contains B.java and hi contains A.java.

所以 B.javafolder1 中,A.java 在名为 hi 的文件夹中。到目前为止一切顺利。

B.java 看起来像这样:

package hi.a12.pkg;
public class B { } 

糟糕。 B.java 表示它位于名为 hi.a12.pkgpackage 中,但它在磁盘上的物理位置是 folder1。这就是问题所在。将您的文件放在 package 语句指定的文件夹中,否则其他 类 将无法找到它们。

理解概念和解决问题的快速方法是:

  1. B.java中的package语句改为package folder1;
  2. A.java中的package语句改为package folder1.hi;
  3. import B in A.javapackage 语句之后作为 import folder.B;
  4. folder1 上面的一个目录编译 B.javajavac folder1\B.java
  5. folder1 上面的一个目录编译 A.javajavac folder1\hi\A.java

您可以在 Oracle documentation

中阅读所有相关信息

有几个问题。

首先,您的包的命名方式似乎有误。尝试

for A.java(应该在目录中..../pkg/a12):

package pkg.a12;

for B.java(必须在目录中.../pkg/a12/hi):

package pkg.a12.hi;

其次,您的文件 A.java 需要使用导入语句说明 B 所在的位置:

package pkg.a12;
import pkg.a12.hi.B;
public class A {B b; }

三、编译A的时候一定要在pkg上面的文件夹,参考A的完整路径:

javac pkg/a12/A.java

这也会编译B.java