Java导入混乱

时间:2009-08-26 14:55:34

标签: java import

有什么区别:

java.awt.*;

java.awt.event.*;

我在很多节目中都找到了。

4 个答案:

答案 0 :(得分:33)

Java中的包不是嵌套的。

当您import java.awt.*时,您只导入包java.awt中的所有类和接口 - 您导入{{{}下的所有包1}},例如java.awt

即使看起来包嵌套(即看起来好像java.awt.eventjava.awt.event的“子包”),但实际情况并非如此。您应该将java.awtjava.awt视为两个不同的,无关的软件包,这些软件包恰好在其名称中具有共同部分。

答案 1 :(得分:5)

第一个只从java.awt包中导入类型(但不包括其子包),而其他只从java.awt.event导入(但不从任何其他包导入)。

虽然Java中的包可以(并且应该)在层次结构中进行组织,但是import语句往往是“保守的” - 当您从该包中导入所有类型时,只能获得那些特定于那个级别的类型,而不是层次结构中的较低级别。

我认为其背后的理由是避免虚假进口。通常最好尽可能少地导入 - 只是简单的必需品,以避免耦合,依赖和歧义(例如,如果将新类添加到名称与名称冲突的包中会发生什么情况另一个包?)。这就是为什么如果你使用Eclipse来组织你的导入,它实际上会在星号版本中添加特定的import语句,即使这意味着额外的行。导入子包中的所有内容会更糟糕,你真的会得到所有东西。

此外,通常的做法是将特殊目的类和特定于实现的类放在它们自己的子包中。通常,除非至关重要,否则您特别希望避免导入它们。再次,导入整个子树将与此冲突。

答案 2 :(得分:1)

像许多人之前说过的那样。

import java.awt。*不会导入java.awt.event ...

中的任何类

这两个包之间的区别在于java.awt。*包括类,如Frame,Button等,java.awt.event。*包中包含可能发生的所有事件/侦听器。

示例,要创建一个Button,您需要类java.awt.Button但是如果您希望在单击Button时发生任何操作,则需要一个将“等待”单击的java.awt.event.ActionListener ,然后生成一个java.awt.event.ActionEvent。

答案 3 :(得分:0)

java.awt.* 不是正则表达式,这是我认为您期待/思考的内容。

java.awt.*将只提供该确切包中的类,而不是嵌套包。想象一下下面涉及的名称空间碰撞!

import com.*

应该注意,使用*被认为是不好的做法。首选显示类名称导入。

进一步阅读:Wikipedia: Namespace (Computer Science)