5

如果我说:

import java.awt.event.ActionListener;

我得到了 ActionListener 类。如果我说:

import java.awt.event.*;

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

import java.awt.*;

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

4

5 回答 5

6

Java 中的“通配符”导入仅适用于实现类的直接级别。

也就是说,如果您有具有完全限定名称的类A,BC

  • com.foo.bar.A;
  • com.foo.bar.B;
  • com.foo.C;

然后导入com.foo.bar.*将允许访问AB无需多言;但C将不可用。

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

现在:

我认为如果您包含一个类,就像在最后两个示例中一样,您有效地导入了该类并继承了它的所有子类。

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

现在,根据编码风格约定,你要么自己弥补,要么必须在工作环境中遵守,这样的通配符导入可能是完全禁止的,你必须A单独导入B。至于静态导入,他们还有其他问题......

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

于 2013-06-03T23:17:32.760 回答
4

java.awt.*与 不同的是java.awt.event.*,第一个将导入java.awt包内的所有类,而第二个将导入所有类java.awt.event,导入功能将只导入类,而不是包。

于 2013-06-03T23:17:29.793 回答
3

来自 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 Abstract Window Toolkit)用于许多相关包以使关系明显,但不显示包含。

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

import java.awt.*;

import java.awt.color.*;

于 2013-06-03T23:25:13.060 回答
3

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

Java中的包名结构对应一个目录结构。所以你可以把它想象成一个名为 java 的目录,在该目录中还有其他几个目录,例如 awt 和 io 等。

当你说

import java.awt.*;

您基本上是在说您想为 java.util.java 目录中名为 awt 的目录中的所有类使用短名称。因此,如果您在代码中使用这样的类名:

   List mylist;

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

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

  java.awt.event.ActionEvent

并且上面的导入语句没有帮助。因此需要另一个导入语句的原因

  import java.awt.event.*;

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

于 2013-06-03T23:26:56.173 回答
2

来自 Sun 关于Using Package Members的文档:

起初,包似乎是分层的,但实际上并非如此。例如,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 Abstract Window Toolkit)用于许多相关包以使关系明显,但不显示包含。

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

import java.awt.*; 
import java.awt.color.*;

如果您有时间,您可能会很好地阅读来自 sun的整个 Packages 跟踪,它彻底地介绍了基础知识和更复杂的概念。从您问题中的语言来看,您将第二个 import 语句称为包括特定类,听起来您并不理解您实际上是在指代包。

于 2013-06-03T23:32:17.187 回答