为什么java源文件需要包声明?

dav*_*ave 13 java compilation package

我想我无法理解java包结构,对我来说,java文件中有一个包声明似乎是多余的,然后还需要出现在与包名匹配的目录中.例如,如果我有一个MyClass.java文件:

package com.example;

public class MyClass {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将需要将此文件放在com/example相对于基本目录的位置,并且我将从java com.example.MyClass基本目录执行以运行它.

为什么编译器不能通过查看目录结构来推断包名?例如,如果我从基本目录编译该文件javac com\example\MyClass.java,我不明白为什么MyClass.java不会隐含属于该com.example包.

我知道有一个默认包,但似乎源文件中的包声明仍然是冗余信息?

Ste*_*n C 16

正如您(隐式)承认的那样,在默认包的情况下,您不需要声明包的名称.

忽略那个狡辩...这种看似冗余的原因是,如果不需要package声明,Java源代码的含义就会模糊不清.例如,路径名为"/home/steve/project/src/com/example/Main.java"的源文件可能有7个不同的完全限定名称......具体取决于您编译代码的方式.最有可能的是,其中只有一个是"正确的".但是,通过查看(仅)源代码文件,您将无法分辨哪一个是正确的.

还应注意,Java语言规范不要求您根据包来组织源代码树.这是一个(大)Java编译器系列的要求,但是可以编写一个不需要这个的符合编译器.在这种可能性中,package声明不会重复.


Phi*_*son 7

转过头来问题:

假设package语句是重要的 - 它表示类的名称空间并且属于类文件.

所以现在问题是 - 为什么类必须在与其包匹配的文件夹中?

答案是,它使得查找它们变得更加容易 - 它只是组织它们的好方法.

这有帮助吗?

  • 我不认为这回答了这个问题.通过解决问题解释为什么文件夹结构应该与包声明匹配,但是你没有解释为什么需要包声明. (2认同)

jbx*_*jbx 7

您必须记住,包不仅仅表示文件夹结构。文件夹结构是Java用来匹配包名的约定,就像类名必须匹配文件名的约定一样。

需要一个包来消除类与同名的其他类的歧义。例如java.util.Date不同于java.sql.Date. 该包还允许访问package-private同一包中的其他类的方法或成员。

你必须反过来看。该类拥有关于其自身、类名和包名的所有信息。然后,当程序需要它并且该类尚未加载时,JVM 通过查看与包名匹配的文件夹结构以及文件名与其类名匹配的类来知道在哪里查找它。