如果我说:
import java.awt.event.ActionListener;
Run Code Online (Sandbox Code Playgroud)
我得到了ActionListener类.如果我说:
import java.awt.event.*;
Run Code Online (Sandbox Code Playgroud)
我得到包含 ActionListener 的事件类?或者更好的是:
import java.awt.*;
Run Code Online (Sandbox Code Playgroud)
我认为,如果你包括一个类,就像在前两个例子中那样,你有效地导入了该类并继承了它的所有子类.但是,当我仅使用最后一行时,例如,Eclipse经常显示错误,说它无法解析某些项目,并建议我同时包含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.*
而无需声明导入.