【问题标题】:Import package with no name Java导入无名Java包
【发布时间】:2015-11-11 07:27:44
【问题描述】:

来自http://cs-fundamentals.com/tech-interview/java/which-java-package-is-imported-by-default.php

在每个 Java 程序中都可以有一个未命名的包,即 只是一个没有名字的包。如果你省略了 package 语句 while 编写类定义,将类名放入 默认包,没有名称。 Java 自动编译器 导入这个包。

这是真的吗?

编辑

我对Java编译器自动导入这个包的担忧。

【问题讨论】:

  • 是的,虽然不鼓励使用默认包。
  • 默认包是一个未命名的包。未命名的包包含其源文件不包含包声明的 java 类。默认包的目的是为了方便开发小型或临时应用程序或刚开始开发时。编译的类文件将在当前工作目录中。你的其余陈述也是正确的。

标签: java import


【解决方案1】:

不,未命名的包不是由编译器导入的。

请注意 Java 语言规范中的以下内容。

来自Compilation Units

没有包声明的编译单元是未命名包 (§7.4.2) 的一部分。

来自Packages

对于小程序和休闲开发,包可以不命名 (§7.4.2) 或具有简单的名称,但如果要广泛分发代码,应使用限定名称选择唯一的包名称。这可以防止如果两个开发组碰巧选择了相同的包名称并且这些包后来在单个程序中使用时可能发生的冲突。

来自Observability of a Package

javajava.langjava.io 包始终是可观察的。

请注意,未命名的包未列出

来自Import Declarations

未命名包 (§7.4.2) 中的类型没有规范名称,因此在每种导入声明中都需要规范名称意味着 (a) 无法导入未命名包中的类型 和 (b) static 未命名包中的类型成员无法导入。因此,§7.5.1§7.5.2§7.5.3§7.5.4 在任何尝试将类型(或其static 成员)导入未命名包中时都需要编译时错误。

【讨论】:

  • 你能告诉我 observable package 是什么意思吗?
【解决方案2】:

没有。声明

Java 编译器会自动导入这个包。

在几个方面都不正确。

首先,无法导入包。 §7.5 (JLS) 说:

导入声明允许引用命名类型或静态成员 通过由单个标识符组成的简单名称(第 6.2 节)。

这仅指命名类型和静态成员。不是包裹!虽然...有一种方便的方法可以从带有import my.pkg.*; 的包中导入每个命名类型。

其次,编译器不会自动从未命名的包中导入任何内容。其实it is not possible to refer to any program element of the unnamed package from any named package

我猜这个语句意味着您可以访问 same 包(您正在为其编写代码)中的所有元素,而无需任何导入语句。但这适用于所有软件包。

【讨论】:

    【解决方案3】:

    是的。如果您在 Eclipse、Netbeans 或其他 IDE 中设置了项目,则可以尝试在不添加包的情况下将类添加到项目中。它通常会说“不建议将类添加到默认包中”之类的内容,但无论如何都允许您将该类添加到默认包中。或者,您可以尝试在没有包的情况下在 .java 上运行 javac,前提是所有导入、语法等都正确。

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 2011-11-24
      • 2023-04-08
      • 1970-01-01
      • 2014-03-07
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多