Java导入混乱

有什么区别:

java.awt.*; 

和:

 java.awt.event.*; 

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

Java中的包不是嵌套的。

import java.awt.* ,只导入java.awt包中的所有类和接口 – 您没有导入java.awt下的所有包,例如java.awt.event

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

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

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

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

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

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

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。

java.awt.* 不是正则表达式,这是我认为你期待/思考的东西。

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

 import com.* 

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

进一步阅读: 维基百科:命名空间(计算机科学)