我对使用Java导入包感到困惑。
当我需要import java.util.Scanner
时,它也由import语句完成:import java.util.*
(这对我有意义,因为Scanner
类在{{1}内部}})。
但这个技巧适用于util
和java.awt.event
。这让我更加困惑。 (如果您的答案是Java包没有嵌套,请告诉我上述技巧的工作原理。如果Java有嵌套和独立包,我怎么能找到它们?
答案 0 :(得分:6)
导入通配符不是递归的。
导入java.awt.*
NOT 从java.awt.event
导入任何内容。它只导入java.awt
中的类,而不是“子包”。
还应该注意的是,导入包实际上并不是做任何东西,它只是告诉Java在哪里查找你使用的类名。
另外,使用通配符无论如何都有点草率。您应该只导入实际使用的类。
编辑:之前已经问过这个问题:Recursive import Java并快速谷歌搜索“java recursive import package”会产生大量结果,包括:
首先,包似乎是分层的,但它们不是。对于 例如,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
中,您必须导入两者 打包包含所有文件:导入
java.awt.*
;导入java.awt.color.*
;
JLS:
包的分层命名结构旨在实现 方便以常规方式组织相关包裹, 但除了禁止a之外,它本身没有任何意义 包具有与顶级相同的简单名称的子包 在该包中声明的类型(第7.6节)。
例如,包之间没有特殊的访问关系 名为
oliver
的名为oliver.twist
和另一个名为evelyn.wood
的包 名为evelyn.waugh
和oliver.twist
的包。也就是说,一个代码 名为oliver
的包无法更好地访问声明的类型 在包{{1}}内,而不是任何其他包中的代码。
答案 1 :(得分:2)
Package是Java组织类文件的方法。导入父包只会导入该包中存在的类,而不是子包。
因此,总而言之,java.awt.*
只会导入java.awt.<Class>
而非java.awt.event.<Class>
导入<package>.*
与导入特定类型没有性能或间接成本。但是,从来没有使用导入被认为是最佳做法<package>.*
这样做的基本原因是保持事物的直线,干净,尽可能少模糊,并且<package>.*
导入会丢失
考虑您已导入java.lang.reflect.*
&amp; java.sql.*
,这两个包都有Array
个类。你最终会处于模棱两可的境地。因此,您应该避免这种情况并导入java.lang.reflect.Array
&amp; java.sql.Array
个别。
Shishir
答案 2 :(得分:0)
Java包看起来像是分层的,但它们不是。每个包名称只是一个点分隔的单词列表,它定义了一个名称空间。所有命名空间不是分层的,而是扁平的,都处于同一级别。
因此,符号import a.b.c.*
表示导入包a.b.c
定义的所有类型,而import a.b.c.Z
表示由包Z
定义的导入类型a.b.c
。