Java导入通配符不导入包内的所有内容

时间:2015-05-24 13:44:46

标签: java import awt actionlistener wildcard

我正在编写一个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内并且我使用通配符*导入所有内容,那么为什么不导入?

2 个答案:

答案 0 :(得分:2)

java.awt.*不包含java.awt.event.ActionListenerjava.awt.event不是java.awt的子包。 import java.awt.event.*将包含java.awt.event.ActionListener

答案 1 :(得分:1)

以下是Java Language Specification

  

按需输入类型声明允许所有可访问类型的a   根据需要导入的命名包或类型。

     

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的目录将位于my.pkg.name目录下。如果你想到它,假设你写了

ls my/pkg/name/*

在该目录中。它的行为非常相似:它只会直接为您提供此目录下的文件,而不是其下的目录。 type-import-on-demand的语义几乎相同(不包括subname"目录"本身,因为它不是类型)。

相关问题