使用通配符导入类

she*_*lbc 5 java import class

如果我说:

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.

fge*_*fge 5

Java中的"通配符"导入仅适用于实现类的直接级别.

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

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

然后导入com.foo.bar.*将允许访问AB不进一步ado; 但是C不可用.

同样,进口com.foo.*将随时C可用,但不是AB.

现在:

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

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

现在,根据代码风格惯例,你要么弥补自己或在你的工作环境,以服从,这样的通配符进口可能纯粹是被禁止的,你就会有进口AB分开.至于静态进口,它们还有其他问题......

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