我是Java开发的新手。我有一个关于 Java 中递归导入的快速问题。
让我们假设包“pkg”包含以下内容
- A类,
- 包 B(这又包含 B1 类)
- 包 C(这又包含 C1 类)
如果我使用import pkg.*
为什么我不允许从包“B”和“C”导入类?
我想了解 Java 不允许我进行递归导入的原因。
我是Java开发的新手。我有一个关于 Java 中递归导入的快速问题。
让我们假设包“pkg”包含以下内容
如果我使用import pkg.*
为什么我不允许从包“B”和“C”导入类?
我想了解 Java 不允许我进行递归导入的原因。
你的问题措辞不好,因为如果你import pkg.*
,你当然可以从包pkg.B
和pkg.C
. 也就是说,这样做完全没问题:
import pkg.*;
import pkg.B.*;
import pkg.C.*;
但是我假设您真正要问的是为什么,如果您import pkg.*
没有自动导入在pkg
. 要回答这个问题,最好求助于Java 语言规范:
包的分层命名结构旨在方便以常规方式组织相关包,但除了禁止包具有与顶级类型相同的简单名称的子包(第 7.6 节)外,其本身没有任何意义在该包中声明。
例如,一个包名
oliver
和另一个包名oliver.twist
之间,或者包名evelyn.wood
和包之间没有特殊的访问关系evelyn.waugh
。也就是说,命名包中的代码对包oliver.twist
中声明的类型的访问没有oliver
任何其他包中的代码更好。
换句话说,当您导入由名为 的包中包含的编译单元定义的import pkg.*
所有顶级类型pkg
时,您不会导入任何子包pkg
(例如pkg.B
或pkg.C
)。
听起来你在问为什么import java.awt.*
不导入java.awt.color.*
等等。
本教程最好地解释了这一点,它说
起初,包似乎是分层的,但实际上并非如此。例如,Java API 包括一个 java.awt 包、一个 java.awt.color 包、一个 java.awt.font 包以及许多其他以 java.awt 开头的包。但是,java.awt.color 包、java.awt.font 包和其他 java.awt.xxxx 包不包含在 java.awt 包中。前缀 java.awt(Java Abstract Window Toolkit)用于许多相关包以使关系明显,但不显示包含。
更重要的是,
导入 java.awt.* 会导入 java.awt 包中的所有类型,但不会导入 java.awt.color、java.awt.font 或任何其他 java.awt.xxxx 包。如果您计划使用 java.awt.color 和 java.awt 中的类和其他类型,则必须导入这两个包及其所有文件:
import java.awt.*; import java.awt.color.*;
Java 中的约定是只导入您需要的类。大多数 IDE 会自动为您组织它们。批量导入类并不像其他语言那样常见。
正如您在原始问题(编辑之前)中描述的那样,对进口没有限制。
假设您具有以下层次结构:
pkg1
A.java
pkg1.pkg2
B.java
pkg1.pkg3
C.java
D.java
您可以导入任何 A.java、B.java、C.java、D.java 或其中的组合。
import pkg1.A;
import pkg1.pkg2.B;
import pkg1.pkg3.C;
import pkg1.pkg3.D;
唯一需要注意的是,在 C 类中,您可以在不显式导入 D的情况下使用 D 类,因为它们共享同一个包。
然而,像这样的一揽子声明import pkg1.*
不会拉入位于包层次结构更下方的类;您还需要导入每个子包:import pkg1.pkg2.*
等。这就是语言的设计方式。