导入通配符是否总是导入所有内容?

4

我正在编写一个小的Java程序,使用了数组,所以我做了以下操作:

import java.util.Arrays;

后来我开始扩展之前所做的事情,并决定想要从用户那里获得输入,因此在那时我添加了:

import java.util.Scanner;

现在我有一个想法。我知道我可以这样做:
import java.util.*

那么我只需要一条导入语句,而不是两个(或者无论我最终需要多少个),但是导入中的通配符是否意味着它将导入该包中的所有内容,无论是否需要,还是只会选择性地拉取功能?
我的直觉是编写更多代码,并仅包含我知道所需的软件包,但如果没有区别,为什么有人要导入更多级别/软件包?(我宁愿懒惰并编写较少的代码)

8
请参考此链接:https://dev59.com/4XVC5IYBdhLWcg3w51ry使用Java导入语句中的通配符会有什么问题? - Mark Meyer
@NuclearGhost - 感谢提供链接,回答问题的后半部分,听起来明确命名要导入的包/类是有用的,以防出现命名冲突。那个帖子的想法就是这样吗? - Mike
这绝对是事实。长远来看,这也使得维护工作更容易进行。未来的开发人员将会清楚地知道你正在使用包中的哪个类。 - Mark Meyer
3个回答

10

要清楚导入的作用是什么。它不意味着加载.class文件和字节码。

导入只允许您使用短类名称以节省输入时间。

因此,如果您在代码中使用java.sql.PreparedStatement,则可以在导入java.sql.PreparedStatement时使用PreparedStatement。您可以编写Java代码,而无需使用任何import语句。您只需要拼写出全部解析的类名。

而且,类加载器仍会在运行时第一次使用时从.class文件中引入字节码。

它可以为您节省击键。就这些。

与类加载毫无关系。

个人而言,我更喜欢避免使用*符号。我拼写出每个导入。我认为这更好地记录了我的意图。我的IDE是IntelliJ,所以我要求它即时插入导入。

懒惰通常对开发人员来说是一种优点,但在这种情况下不是。拼写它们并让您的IDE逐个插入它们。

如果您键入:


import java.util.*;

您可以使用短名称来引用ScannerList

但如果您想对FutureTaskLinkedBlockingQueue使用相同的方法,则需要进行以下操作:

import java.util.concurrent.*;

好的,那就是我想问的。我没有正确的“java”术语。因此,无论是否使用通配符(从最终软件包大小来看),都没有关系,因为它不会加载导入的类。只需要在使用时小心,以防命名冲突。就这样了? - Mike
2
+1,import 不同于 #include。它只是允许编译器正确解析所有内容。拥有一个 import 语句并不意味着类实际上已经被加载。类实际上被 加载 的唯一情况在 JLS §12.4.1 中有详细说明。请注意,导入语句没有在任何地方提到。 - Brian
“Link”这个词让我想到了C/C++的链接。我不认为你是指那个。我也不会使用“编译器来正确链接所有内容”的说法。就像我说的一样:使用短名称而不是完全解析的名称。就是这样。 - duffymo
把它们拼出来,让你的IDE逐个插入它们。是的,我的“IDE”一直是gedit和javac,所以没有自动完成...我想我应该改变这种情况。 - Mike
IntelliJ 今天正在举行玛雅末日特卖活动,所以您可以以较低的价格购买到市场上最好的 IDE。或者选择免费的社区版:http://www.jetbrains.com - duffymo

3
通配符导入会将包中的所有内容都导入。但是,使用像Eclipse这样的IDE,它会给你提供组织导入的可能性。

1

通配符导入一个包中的所有类和接口。

然而,通配符导入不会导入以相同名称开头的其他包。

例如,导入 java.xml.* 不会导入 java.xml.bind 包。


抱歉,我没太听懂... import java.xml.* 无法提供 java.xml.bind 的功能吗?我认为使用 * 的意思是你无需显式地请求每个单独的资源。就像我的问题中用到的 java.utils 一样。 - Mike
我更新了我的答案以澄清。* 导入包中的所有类和接口。* 不会导入其他包。在你的问题中,java.util.Scanner是一个类,而不是一个包。 - Aaron Kurtzhals

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