Java导入混乱

13 java import

有什么区别:

java.awt.*;
Run Code Online (Sandbox Code Playgroud)

和:

java.awt.event.*;
Run Code Online (Sandbox Code Playgroud)

我在许多程序中都找到了.

Jes*_*per 33

Java中的包不是嵌套的.

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

尽管它看起来像是嵌套的(即,它看起来好像java.awt.event是一个"子包" java.awt),但实际情况并非如此.你应该把java.awt,并java.awt.event为发生两个不同的,不相关的软件包的名称中常见的一部分.

  • 不 - 这是Jesper的观点.import java.awt.*; 导入其包正好是java.awt的每个类.它不会导入其包只是以java.awt开头的任何类. (15认同)
  • import java.awt.* 不是也会自动导入 java.awt.event 吗? (2认同)

Uri*_*Uri 5

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

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

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

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