多次导入库的必要性是什么?

3
在大多数代码示例中,我看到人们这样做。
import javax.swing.*; // for the frame
import java.awt.*; // for the checkBox and the label
import java.awt.event.*; // for the checkBox listener

如果我没记错的话,当我们说import java.awt.*时,它会导入其中的所有内容,因此不需要说import java.awt.event.*;是否有速度提升?还有人能解释一下导入库是什么意思吗?它是导入一个简单的文本类以包含在源代码中,还是告诉JVM包括所导入内容的字节码?因此,在Java中导入仅切换命名空间,因此我不必输入长类名。
4个回答

6
忘掉术语subpackage,快点。在Java世界中不存在这个词。 java.awt是一个包(命名空间),java.awt.event是另一个包,它们没有任何关系。它们的名称共享一些字符,但这些包是完全不相关的。导入语句从一个包(命名空间)中导入一个或多个类。如果您需要来自不同包(命名空间)的类,则必须添加另一个导入语句。
顺便说一下,在回答另一个问题的评论时:您不必使用导入语句。如果您不使用它们,则必须在Java源文件中使用完全限定的类名(除了:从java.lang和当前包导入的类会自动导入)。因此,import可以被认为是保持代码可读性的方便方法。
在源文件中使用一个类并不需要导入。

因此,在Java中导入仅切换命名空间,因此我不必键入长类名? - dave
它不是切换命名空间。如果你使用import java.util.*;,你可以写成List<Integer> list = null;,否则你必须写成java.util.List<Integer> list = null;。这两个语句是等价的,并且编译成相同的字节码。 - Andreas Dolk
@dave 它不是在切换命名空间,而是在打开命名空间。 - user207421
当前包中的类也会自动导入。 - Paŭlo Ebermann

4

The line...

import java.awt.*;

仅仅导入一个包并不意味着所有的子包也会被导入,你需要显式地导入每个包。举个例子,导入java.*并不能给你整个java库。

就我所知,除非你有充分的理由使用*,否则我建议只导入特定的类。


1
请避免使用“子包”一词。Java包没有任何层次结构。 - Andreas Dolk
确实 - 术语不当。由于它们基于文件系统,我不小心使用了“子文件夹”一词。 - Ben J
2
不正确的是,标准的类加载器期望在文件系统中映射到包名称的位置上有 *.class 文件。但这只是一种方式,其他类加载器可以实现不同的算法来查找类文件 - 考虑一个从数据库加载类文件的类加载器:没有文件和文件夹。但包名称可以是某个 CLASS 表中的主键。 - Andreas Dolk
1
你好 - 当我们学习Java时,我们被告知按包名存储类,否则应用程序将无法编译。后来我们发现,这并不是完全的真相 ;) - Andreas Dolk

1

导入一个包不会导入它的子包。

导入也涉及到命名空间的切换。

如果你只有import java.awt.*,并且你要使用类java.awt.Outer.Inner,那么在你的代码中,你必须将其称为Outer.Inner

相比之下,当你说import java.awt.Outer.*时,你可以将内部类称为Inner


因此,在 Java 中导入只是切换命名空间,这样我就不必输入长类名了? - dave
1
请避免使用“子包”这个术语。Java包没有任何分层结构。 - Andreas Dolk

1

导入只是编译时的一个特性,在字节码中,您将仅找到对特定类的直接引用,每次使用其实例。

"import"结构存在的唯一目的是消除每次使用完整类名的需要。


只是一个快速的提醒:请不要混淆“类”和“实例”这两个概念。我会说:“每次使用时都要清楚区分。” - Andreas Dolk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接