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

标签 java import awt actionlistener wildcard

我正在编写一个 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/

相关文章:

java - 如何在 Java 中声明和初始化数组?

java - 在本地机器上运行 ignite

php - 跳过导入 csv 的第一行

python - 是否可以在不实例化类的情况下导入类方法?

java - 多个 JButton 实例的 ActionListener

java - AppletViewer- "applet not initialized"

java - 无法将属性 'innerHTML' 设置为 null。 AJAX 问题 (java)

java - Eclipse java调试: source not found

sql - MySQL 仅从 CSV 导入一行

java - 如何在 Swing 应用程序的后台加载图像?