当前位置: 首页 > 面试题库 >

使用通配符导入类

林烨华
2023-03-14
问题内容

如果我说:

import java.awt.event.ActionListener;

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

import java.awt.event.*;

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

import java.awt.*;

我认为,如果像上两个示例中那样包含一个类,则可以有效地导入该类并继承其所有子类。但是,例如,当我仅使用最后一行时,Eclipse经常显示错误,表明它无法解析某些项目,并建议我
同时 包含java.awt和java.awt.event。


问题答案:

Java中的“通配符”导入仅在实现类的最直接级别上起作用。

也就是说,如果你有课ABC与完全合格的名称:

  • 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在不同的包中有两个名为的类:编译器应该做什么?

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

最后,请注意,默认情况下,java.lang.*无需声明导入就可以使用全部。



 类似资料:
  • 这可能是一个简单的问题,但谷歌什么也没有回报。 我已经阅读了java中的帮助包-导入不工作 我仍然不明白为什么直接导入可以工作,但通配符不行。[编辑]我所说的类包是指一个类包。我对Java还是新手,所以我不知道语义学[编辑] 我有一个课程包:,当我尝试导入com时。公司* 我收到以下错误。 如果我导入明确表示我没有问题。 所以我想我有一个解决方案,但为了学习,有人能解释一下我为什么会看到这个问题吗

  • 问题内容: 我正在研究一个小的Java程序,并且正在使用数组,所以我做到了: 后来,我开始扩展以前做过的事情,并决定要从用户那里得到输入,因此我添加了: 现在发生了一个想法。我知道我可以这样做: 然后,我只需要1条导入行,而不是2条(或者我最终需要很多条),但是导入中的通配符是否意味着它将从该包中导入 所有内容 ,而不管是否需要它,或者仅将选择性功能被拉? 我的直觉是编写更多代码,仅包含我 知道

  • 问题内容: 两者之间的性能复杂度是多少 和 PS。 我知道第一个文件将包含每个文件,第二个文件将仅包含选定的类文件。 问题答案: 在运行时0。 两者都生成相同的字节码

  • 问题内容: 为什么不包括?Java不应该有类似的东西吗?还是有任何原因(除了他们只是没有做,而不是他们不能做)? 谢谢 问题答案: Java并不将包视为真正的子类。而和可能看起来像第二个是莫名其妙的第一部分,它们被视为完全独立的点主要是那里整洁。 这意味着您不必担心以后在某个超级或子包中声明的类或接口与另一个类相同的命名,也意味着您实际上应该只写几行导入。 正如Peter Lawrey解释的那样,

  • 问题内容: 使用Type通配符的Update()也存在该问题,但是我发现DocumentExists()的作用相同,因此在此将问题简化如下: 这有效… 但这失败了 如果我完全省略Type,它也会失败。有人知道如何进行这项工作吗?(即使不管文档的类型如何都可以,对我而言还是可以的。) 问题答案: 据我所知,不可能在类型名称中指定通配符,但是您可以做一些技巧。 您可以在索引中查询具有特定ID的文档,并

  • 考虑下面的代码。 是否可以使InteliJ自动将每个通配符导入重构为显式导入(无论范围内使用什么)? 例如到? 我的搜索表明这是不可能的,但也许我错了? 这是一个相关但不同的问题。