我是Java开发的新手。我有一个关于Java中递归导入的快速问题。
让我们假设包“pkg”包含以下
如果我使用import pkg.*
为什么我不允许从包“B”和“C”导入类??
我想了解Java中不允许我进行递归导入的理由。
答案 0 :(得分:9)
您的问题措辞不当,因为如果您import pkg.*
,您当然可以从包pkg.B
和pkg.C
导入类。也就是说,这样做非常好:
import pkg.*;
import pkg.B.*;
import pkg.C.*;
但是我假设你真正问的是为什么,如果你import pkg.*
它不会自动导入pkg
子包中声明的类型。要回答这个问题,最好转向Java Language Specification:
包的分层命名结构旨在方便以常规方式组织相关包,但除了禁止包含具有与顶级类型相同的简单名称的子包之外,它本身没有意义( §7.6)在该包中声明。
例如,名为
oliver
的包与另一个名为oliver.twist
的包之间或名为evelyn.wood
和evelyn.waugh
的包之间没有特殊的访问关系。也就是说,名为oliver.twist
的包中的代码无法更好地访问包oliver
中声明的类型,而不是任何其他包中的代码。
换句话说,当您import pkg.*
时,您要导入由名为pkg
的包中包含的编译单元定义的所有顶级类型,但您是不导入pkg
的任何子包(例如pkg.B
或pkg.C
)。
答案 1 :(得分:5)
听起来你问为什么import java.awt.*
也不会导入java.awt.color.*
等等。
最好用this tutorial解释
首先,包似乎是分层的,但它们不是。对于 例如,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抽象窗口 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.*;
答案 2 :(得分:1)
Java中的约定是仅导入所需的类。大多数IDE会自动为您组织它们。批量导入类并不像其他语言那样常见。
答案 3 :(得分:0)
您在原始问题(编辑之前)中描述的对进口没有限制。
假设您有以下层次结构:
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.*
等。这就是语言的设计方式。