使用通配符导入类

时间:2013-06-03 23:14:39

标签: java class import

如果我说:

import java.awt.event.ActionListener;

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

import java.awt.event.*;

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

import java.awt.*;

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

5 个答案:

答案 0 :(得分:5)

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

也就是说,如果您使用完全限定名称的课程ABC

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

然后导入com.foo.bar.*将允许访问AB而无需进一步操作;但C将无法使用。

同样,导入com.foo.*很容易C可用,但不能AB

现在:

  

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

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

现在,根据您自己弥补或必须在工作环境中服从的编码风格约定,这些通配符导入可能纯粹而且简单地被禁止,您必须导入AB分开。至于静态导入,它们还有其他问题......

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

来自Java教程:Apparent Hierarchies of Packages

  

首先,包似乎是分层的,但它们不是。例如,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.colorjava.awt.font或任何其他java.awt.xxxx个包。如果您计划使用java.awt.color中的类和其他类型以及java.awt中的类,则必须导入包含所有文件的包:

     

import java.awt.*;

     

import java.awt.color.*;

答案 3 :(得分:3)

请记住,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类,编译器会在当前目录中查找名为ActionEvent的类,或java.awt.ActionEvent或java.awt.event.ActionEvent,直到找到它为止。

答案 4 :(得分:2)

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

  

首先,包似乎是分层的,但它们不是。例如,Java   API包括java.awt包,java.awt.color包,a   java.awt.font包,以及以java.awt开头的许多其他包。   但是,java.awt.color包,java.awt.font包和   其他java.awt.xxxx包不包含在java.awt包中。   前缀java.awt(Java Abstract Window Toolkit)用于a   使相关关系明显的相关包的数量,但不是   显示包含。

     

导入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的the entire Packages trail,它完整地介绍了基础知识和更复杂的概念。从您问题中的语言,您将第二个导入语句称为包含特定类,您听起来并不理解您实际上是指包。