为什么我必须导入 java.awt.* AND java.awt.event.* (例如)

Why do I have to import java.awt.* AND java.awt.event.* (for example)

在我现在正在进行的一个锻炼计划中,它需要一些导入,如下所示:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.net.URL;

ELI5:我的问题(我刚刚过了新手入门教程,进入中级?现在。)正如标题所暗示的那样。如果我已经用 java.awt.* 覆盖了它,我真的需要导入 java.awt.event.* 吗?

如果不是,为什么这是表面上的惯例?

以星号结尾的导入语句仅从该包导入所有 classes,而不是任何子包。因此,如果您有 class A 住在 com.example,而 class B 住在 com.example.subtype,则导入语句如

import com.example.*;

将导入 class A 但不会导入 class B。要导入 class B,您必须添加

import com.example.subtype.*;

这是为了确保如果您需要 'higher' 包中的多个 classes(从层次上讲),您不会从每个子包中导入所有 classes在它下面您可能不需要或不需要,其中一些可能具有相同的名称,导致 class名称冲突。

即,如果有一个 class com.example.subtype.Type 和一个 class com.example.order.Type 你不希望像 import com.example.*; 这样的导入语句来导入两者类型。

这也是为什么从一个包中显式导入某些 class 而不是所有 class 通常更好的原因(就像你对星号所做的那样),除非你需要那么多 class从那个包中导入的负载只会造成混淆。

您不必使用 .*

例如,你只想使用一个JFrame,你可以导入

import javax.swing.*;

但是如果你只需要一个,为什么要导入包的所有功能(而不是子包)?

最好使用这个(在这个例子中):

import javax.swing.JFrame;

另见此处:Import package.* vs import package.SpecificType