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

Mik*_*ike 3 java import packages wildcard

我正在研究一个小程序,并使用数组,所以我做了:

import java.util.Arrays;
Run Code Online (Sandbox Code Playgroud)

后来我开始扩展我以前做过的事情并决定我想从用户那里获得输入,所以在那一点上我添加了:

import java.util.Scanner;
Run Code Online (Sandbox Code Playgroud)

现在出现了一个想法.我知道我可以这样做:

import java.util.*
Run Code Online (Sandbox Code Playgroud)

然后我只需要1个导入行而不是两个(或者我最终需要的很多),但导入中的通配符是否意味着它将从该包导入所有内容,无论是否需要,或者只是选择性功能被拉?

我的直觉是编写更多的代码,只包含我知道我需要的软件包,但如果没有区别,为什么有人会导入更多级别/软件包呢?(我宁愿懒惰也少写代码)

duf*_*ymo 8

清楚导入正在做什么.它并不意味着加载.class文件和字节代码.

所有导入都允许您使用短类名来保存键入.

因此,如果您java.sql.PreparedStatement在代码中使用PreparedStatement,则可以在导入时使用java.sql.PreparedStatement.您可以永久编写Java代码,而无需使用单个import语句.你只需要拼出所有完全解析的类名.

类加载器仍然会.class在运行时首次使用文件中的字节代码.

它可以节省您的击键次数.就这样.

它与类加载无关.

就个人而言,我更愿意避免使用*表示法.我拼写每一个导出.我认为它更好地记录了我的意图.我的IDE是IntelliJ,所以我要求它动态插入导入.

懒惰通常是开发人员的一种美德,但在这种情况下并非如此.拼出它们并让你的IDE单独为它们插入它们.

如果你输入

import java.util.*;
Run Code Online (Sandbox Code Playgroud)

你会得到引用Scanner,并List通过他们的短名称.

但是,如果你想做同样的事情FutureTask,LinkedBlockingQueue你将不得不这样做:

import java.util.concurrent.*;
Run Code Online (Sandbox Code Playgroud)

  • +1,`import`与`#include`不是一回事.它所做的只是允许编译器正确解决所有问题.使用`import`语句不会导致实际加载类.[JLS§12.4.1](http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-中概述了实际上*加载*的唯一情况. 12.4.1).请注意,任何地方都没有提到导入. (2认同)