我正在编写一个 Java 程序,它有一个带有 Action 监听器的按钮:
JButton button = new JButton("Change");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText(textField.getText());
}
});
在文件的顶部,我有这两个导入语句:
import java.awt.*;
import javax.swing.*;
我知道这是糟糕的做法,我正在复习考试,将它写在页面顶部会更容易、更快捷。
但是,我收到一个错误,告诉我导入 java.awt.event.ActionListener
如果 event
包在 java.awt
中并且我使用通配符 *
导入所有内容,那么为什么它没有被导入??
最佳答案
这是 Java Language Specification 中按需导入类型的定义:
A type-import-on-demand declaration allows all accessible types of a named package or type to be imported as needed.
TypeImportOnDemandDeclaration:
import
PackageOrTypeName . * ;
理解术语很重要:“命名包的所有可访问类型”是指 package
声明特别是 之前的所有类型.*
.
所以,如果一个类的包定义如下:
package my.pkg.name;
然后它将可用于import my.pkg.name.*
,但是如果类定义如下:
package my.pkg.name.subname;
那么它将无法用于import my.pkg.name.*
,因为它不属于那个包。它特别属于 my.pkg.name.subname
,就 Java 而言,这是一个不同的包。
确实,Java 实现通常希望包在目录层次结构中排序,因此 my.pkg.name.subname
的目录将位于 的目录下我的.pkg.name
。如果你想到它,假设你写了
ls my/pkg/name/*
在该目录中。它的行为非常相似:它只会直接给你这个目录下的文件,而不是它下面的目录。 type-import-on-demand 的语义几乎相同(不包括 subname
“目录”本身,因为它不是类型)。
关于Java导入通配符不导入包内的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424206/