Java 使用通配符导入类

Java 使用通配符导入类,java,class,import,Java,Class,Import,如果我说: import java.awt.event.ActionListener; import java.awt.event.*; 我得到了ActionListener类。 如果我说: import java.awt.event.*; 我得到了包含ActionListener的事件类? 或者更好: import java.awt.*; 我认为,如果您包括一个类,就像在上两个示例中一样,那么您可以有效地导入该类并继承其所有子类。但是,例如,当我仅使用最后一行时,Eclipse经常显示

如果我说:

import java.awt.event.ActionListener;
import java.awt.event.*;
我得到了ActionListener类。 如果我说:

import java.awt.event.*;

我得到了包含ActionListener的事件类? 或者更好:

import java.awt.*;

我认为,如果您包括一个类,就像在上两个示例中一样,那么您可以有效地导入该类并继承其所有子类。但是,例如,当我仅使用最后一行时,Eclipse经常显示错误,表示它无法解析某些项,并建议同时包含java.awt和java.awt.event

java.awt.*
java.awt.event.*
不同,第一个将导入
java.awt
包中的所有类,而第二个将导入
java.awt.event
中的所有类,导入函数将只导入类,而不导入包。

通配符Java中的导入只适用于实现类的即时级别

也就是说,如果您有类
A
B
C
,并且具有完全限定名:

  • com.foo.bar.A
  • com.foo.bar.B
  • com.foo.C
然后导入
com.foo.bar.*
将允许访问
A
B
,无需进一步的ado;但是
C
将不可用

同样,导入
com.foo.*
将很容易获得
C
,但不是
A
B

现在:

我认为,如果您包括一个类,就像在上两个示例中一样,那么您可以有效地导入该类并继承其所有子类

事实并非如此。即使
B
“继承”
A
,如果选择使用完全限定的导入
com.foo.bar.A
,它也不会自动导入
com.foo.bar.B
。您必须单独导入
B
。这是有意义的:例如,没有任何东西强迫接口或抽象类的实现与其基本接口/基类在同一个包中;在同一个项目中,您可能在不同的包中有两个名为
B
的类:编译器应该做什么

现在,根据编码风格惯例,您可以自己编写,也可以在您的工作环境中遵守,这样的通配符导入可能被完全禁止,并且您必须分别导入
A
B
。至于静态导入,他们还有其他问题

最后,请注意,默认情况下,您可以使用所有
java.lang.
,而无需声明导入。

来自java教程:

起初,包看起来是分层的,但实际上并非如此。例如,Java API包括一个
Java.awt
包、一个
Java.awt.color
包、一个
Java.awt.font
包以及许多其他以Java.awt开头的包。但是,
java.awt.color
包、
java.awt.font
包和其他
java.awt.xxxx
包不包括在
java.awt
包中。前缀
java.awt
(java抽象窗口工具包)用于许多相关包,以使关系变得明显,但不显示包含

导入
java.awt.*
导入
java.awt
包中的所有类型,但不导入
java.awt.color
java.awt.font
或任何其他
java.awt.xxxx
包。如果计划使用
java.awt.color
中的类和其他类型以及java.awt中的类和类型,则必须导入两个包及其所有文件:

import java.awt.*

导入java.awt.color.*


请记住,import语句只是为了方便起见。它使您可以使用类的短名称,而不是完全限定的名称

Java中的包名结构对应于目录结构。因此,您可以将其视为一个名为java的目录,在该目录中还有其他几个目录,如awt和io等

当你说

import java.awt.*;
您基本上是说,您希望对名为java的目录中名为awt的目录中的所有类使用短名称。因此,如果在代码中使用类名,如下所示:

   List mylist;
然后,编译器将尝试在当前包中查找名为List的类或名为java.awt.List的类

因此,如果awt目录中有一个名为event的目录,并且该目录中有一个名为ActionEvent的类,则完全限定名为:

  java.awt.event.ActionEvent
上面的import语句也没有帮助。因此需要另一个导入语句

  import java.awt.event.*;

现在,如果您使用ActionEvent类,编译器将在当前目录或java.awt.ActionEvent或java.awt.event.ActionEvent中查找名为ActionEvent的类,直到找到为止。

摘自Sun的文档:

起初,包看起来是分层的,但实际上并非如此。例如,Java API包括java.awt包、java.awt.color包和 以及许多其他以java.awt开头的包。 但是,java.awt.color包、java.awt.font包和 java.awt包中不包括其他java.awt.xxxx包。 前缀java.awt(java抽象窗口工具包)用于 相关包的数量,以使关系明显,但不 显示包容

导入java.awt.*导入java.awt包中的所有类型, 但它不导入java.awt.color、java.awt.font或任何其他文件 java.awt.xxxx包。如果您计划使用类和其他类型 在java.awt.color和java.awt中,必须同时导入这两个文件 包及其所有文件:

如果你有时间,你可能会很好地通读《太阳报》,它通读了基础知识和更复杂的概念。从你问题中的语言来看,你在哪里