Java 导入混淆

2022-09-04 05:46:36

有什么区别:

java.awt.*;

和:

java.awt.event.*;

我在许多程序中都找到了两者。


答案 1

Java 中的包不是嵌套的。

当您时,您只是导入包中的所有类和接口 - 您没有导入 下的所有包,例如 。import java.awt.*java.awtjava.awtjava.awt.event

即使它看起来像包是嵌套的(即,它看起来像是一个“子包”),但事实并非如此。您应该将 和 视为两个不同的,不相关的软件包,它们的名称中恰好有一个共同的部分。java.awt.eventjava.awtjava.awtjava.awt.event


答案 2

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

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

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

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