Java包是嵌套的,而不是嵌套的......两者都有?

时间:2014-03-20 13:36:24

标签: java import

我对使用Java导入包感到困惑。

当我需要import java.util.Scanner时,它也由import语句完成:import java.util.*(这对我有意义,因为Scanner类在{{1}内部}})。

但这个技巧适用于utiljava.awt.event。这让我更加困惑。 (如果您的答案是Java包没有嵌套,请告诉我上述技巧的工作原理。如果Java有嵌套和独立包,我怎么能找到它们?

3 个答案:

答案 0 :(得分:6)

导入通配符不是递归的。

导入java.awt.* NOT java.awt.event导入任何内容。它只导入java.awt中的类,而不是“子包”。

还应该注意的是,导入包实际上并不是任何东西,它只是告诉Java在哪里查找你使用的类名。

另外,使用通配符无论如何都有点草率。您应该只导入实际使用的类。

编辑:之前已经问过这个问题:Recursive import Java并快速谷歌搜索“java recursive import package”会产生大量结果,包括:

The Java tutorials

  

首先,包似乎是分层的,但它们不是。对于   例如,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.colorjava.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.waugholiver.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