【问题标题】:Relationship between a package statement and the directory of a .java file?包语句与 .java 文件的目录之间的关系?
【发布时间】:2015-06-22 16:22:49
【问题描述】:

考虑一个包层次结构文件夹 1/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 没有。

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

但仍然显示 B 类未找到。

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

【问题讨论】:

  • 你究竟是如何编译它们的,从哪里编译? (我强烈怀疑你只是从错误的地方编译它们......)
  • 您的软件包名称似乎与您的文件夹层次结构不匹配。 hi.a12.pkg.B 应该在 [some prefix]/hi/a12/pkg/B.java 中。我不明白你为什么不对 A 使用相同的包前缀。
  • 编译 B.java 后,我使用 cmd 命令从 hi 文件夹编译 A.java:javac -cp。 -d 。 A.java
  • @JonSkeet 我强烈怀疑你只是从错误的地方编译它们。这是一个非常不正确的说法。无论您尝试从何处编译类,它们位于不同于package 语句的目录结构中这一事实将总是阻止其中一个被编译。
  • @ChetanKinger:我错过了这样一个事实,即它们位于不同的包中,与文件夹结构不匹配......(话虽如此,语句是正确的,因为我确实强烈怀疑...只是怀疑不正确:)

标签: java package


【解决方案1】:

考虑一个包层次结构文件夹 1/hi。 folder1 包含 B.java 和 hi 包含 A.java。

所以B.java 位于folder1 中,而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 BA.java 之后 package 声明为 import folder.B;
  4. B.javafolder1上方的一个目录编译为javac folder1\B.java
  5. A.javafolder1上方的一个目录编译为javac folder1\hi\A.java

您可以在Oracle documentation 中阅读所有相关信息

【讨论】:

  • 我认为包名只是用来指定类文件应该创建的位置。所以这里B.class文件是在hi>a12>pkg>B.class中创建的 所以这里应该没有问题
  • @Ronaldo7 这是一个错误的理解。 package 名称是类的完全限定名称的一部分。当您编译具有 package 名称的 class 时,class 的完全限定名称是 packagename.classname。这就是Java 具有导入语句的原因。这样您就不必在代码中的任何地方都写packaganame.classname,您可以在import 类之后使用简写。请试试我的建议。
  • @Ronaldo7 既然你是新来的,请阅读:What should I do when someone answers my quesiton。接下来,查看来自一家非常著名的公司的 this 综合文档,该公司恰好也是 Java 语言的当前所有者。如果您对当前问题范围之外的如何运行程序还有任何疑问,请在网站上发布一个新问题,我们也很乐意帮助您回答该问题
  • 我的初始代码是为 B 类制作 hi.a12.pkg.B 合格名称 好的!在 A.java 中,我使用这个限定名称作为 a12.pkg.A 两者都在同一个包中创建类文件,但它们彼此无法访问 link 见评论..
  • 第5步你已经给出了仍然没有编译:给出错误的类文件,类文件包含错误的类文件夹1.hi.B
【解决方案2】:

有几个问题。

首先,您的软件包似乎被错误地命名了。试试

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

package pkg.a12;

对于B.java(必须在目录.../pkg/a12/hi):

package pkg.a12.hi;

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

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

第三,编译A的时候一定要在pkg上面的文件夹中,并引用A的全路径:

javac pkg/a12/A.java

这也将编译 B.java

【讨论】:

  • 如果你忽略了这部分问题,这里是:folder1 包含 B.java,hi 包含 A.java。。现在,当您说首先,您的包似乎被错误地命名了,我相信您会意识到包的命名方式无关紧要。
  • 好点 - 谢谢,Chetan。我做了我经常做的事情并阅读了代码,但没有阅读“cmets”,假设真正的意图在代码中。但它可能不是,你的答案在处理这种差异方面会更好。我试图涵盖更广泛的场景,包括缺少导入和编译不正确的可能性。
  • 关于导入的要点。我忽略了它。但是,主要问题是 OP 对 package 与计算机上的物理位置之间关系的理解,这从问题的前几行中显而易见。
猜你喜欢
  • 2017-09-20
  • 2021-09-01
  • 2012-12-25
  • 2016-03-22
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2010-09-14
相关资源
最近更新 更多