如果我说:
import java.awt.event.ActionListener;
我得到了ActionListener类。 如果我说:
import java.awt.event.*;
我得到的事件类包括 ActionListener? 或者更好的是:
import java.awt.*;
我认为如果你包含一个类,就像在前两个例子中那样,你有效地导入了该类并继承了它的所有子类。但是,当我仅使用最后一行时,例如,Eclipse经常会显示错误,说它无法解析某些项目,并建议我将两者包含在java.awt和java.awt.event中。
答案 0 :(得分:5)
Java中的“通配符”导入仅适用于实现类的直接级别。
也就是说,如果您使用完全限定名称的课程A
,B
和C
:
com.foo.bar.A
; com.foo.bar.B
; com.foo.C
; 然后导入com.foo.bar.*
将允许访问A
和B
而无需进一步操作;但C
将无法使用。
同样,导入com.foo.*
很容易C
可用,但不能A
和B
。
现在:
我认为如果你包括一个类,就像在前两个例子中一样,你有效地导入了该类并继承了它的所有子类。
没有。即使B
“继承”A
,如果您选择使用完全限定的导入com.foo.bar.A
,也不会自动导入com.foo.bar.B
。您必须单独导入B
。这是有道理的:没有什么能迫使接口或抽象类的实现与它们的基本接口/基类在同一个包中;在同一个项目中,您可能在不同的包中有两个名为B
的类:编译器应该做什么?
现在,根据您自己弥补或必须在工作环境中服从的编码风格约定,这些通配符导入可能纯粹而且简单地被禁止,您必须导入A
和B
分开。至于静态导入,它们还有其他问题......
最后请注意,默认情况下,您可以使用所有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.color
,java.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,它完整地介绍了基础知识和更复杂的概念。从您问题中的语言,您将第二个导入语句称为包含特定类,您听起来并不理解您实际上是指包。