我正在编写一个Java程序,其中包含一个带有动作侦听器的按钮:
JButton button = new JButton("Change");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText(textField.getText());
}
});
在文件的顶部,我有两个import语句:
import java.awt.*;
import javax.swing.*;
我知道这是一种可怕的做法,我正在修改考试,而且只需在页面顶部写一下就可以更容易,更快捷。
但是,我收到错误,告诉我导入java.awt.event.ActionListener
如果event
包在java.awt
内并且我使用通配符*
导入所有内容,那么为什么不导入?
答案 0 :(得分:2)
java.awt.*
不包含java.awt.event.ActionListener
。 java.awt.event
不是java.awt
的子包。 import java.awt.event.*
将包含java.awt.event.ActionListener
。
答案 1 :(得分:1)
以下是Java Language Specification中 按需输入类型声明允许所有可访问类型的a
根据需要导入的命名包或类型。 TypeImportOnDemandDeclaration: 理解术语非常重要:"命名包的所有可访问类型"表示 所以,如果一个类的包被定义为: 然后 然后 Java实现通常希望在目录层次结构中对包进行排序,因此 在该目录中。它的行为非常相似:它只会直接为您提供此目录下的文件,而不是其下的目录。 type-import-on-demand的语义几乎相同(不包括
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而言,它是一个不同的包。my.pkg.name.subname
的目录将位于my.pkg.name
目录下。如果你想到它,假设你写了ls my/pkg/name/*
subname
"目录"本身,因为它不是类型)。