在 java 中有两种导入机制
- 单类型导入(single-type-import)
- 例如
import java.io.File;
- 例如
- 按需类型导入(type-import-on-demand)
- 例如
import java.io.*;
- 例如
单类型导入(single-type-import)
单类型导入比较好理解,仅仅导入一个public类或者接口。
查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:
1。提高编译速度。
2。避免命名冲突。(例如:当你import java.awt.*;import java.util.*后,使用List的时候编译器将会出编译错误)
当然,使用单类型导入会使用你的import语句看起来很长。
按需类型导入(type-import-on-demand)
按需类型导入,虽然使用了 * 号,但并不是导入这个包下的所有类,而仅仅导入当前类需要使用的类。
既然如此,按需类型导入是不是就比单类型导入要好呢?
并不是!!!由于没有明确类名称,在编译期,java编译器从启动目录(bootstrap)、扩展目录(extension)和用户类路径下去查找需要导入的类。
定位类文件
编译器的类文件定位方法大致可以理解为如下公式: 绝对路径=顶层路径名\包名\类名.class
对于单类型导入,由于包名和类名都已经确定,所以可以一次定位成功。
对于按需类型导入,编译器会找出所有可能的类
例如,当你导入以下包,并且当前类中用到了 File 类
package com;
import java.io.*;
import java.util.*;
编译器会在导入的包中查找 File,最终结果如下
java.lang.File编译器会自动导入java.lang包java.io.File来自import java.io.*;java.util.File来自import java.util.*;
由于编译器发现了多个个同名的类,因此编译器会报错。需要你整理你的 import,保证不会存在同名的 File 类
需要注意的是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。假设此时的顶层路径有三个,那么编译器就会进行3*3=9次查找。
总结
- 按需类型导入(xxx.xxx.*) 是不会导入该包下所有的类的
- 按需类型导入(xxx.xxx.*) 绝对不会降低代码的执行效率,但会影响到代码的编译速度
建议
查看JDK的源代码可以发现,源码一般不会使用按需类型导入。
因为使用单类型导入至少有以下两点好处:
- 提高编译速度
- 避免命名冲突
因此,还是推荐使用单类型导入,虽然这会使你的 import 语句看起来很长
番外
JDK1.5 中的引入了 import static(静态导入),用于导入指定类的某个静态成员变量和静态方法
例如
import static com.wqlm.util.静态成员变量名
import static com.wqlm.util.静态方法名
当然,前提是这些 静态成员变量名和静态方法名 是能访问到的