java import 导入机制

2,857 阅读3分钟

在 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的源代码可以发现,源码一般不会使用按需类型导入。

因为使用单类型导入至少有以下两点好处:

  1. 提高编译速度
  2. 避免命名冲突

因此,还是推荐使用单类型导入,虽然这会使你的 import 语句看起来很长

番外

JDK1.5 中的引入了 import static(静态导入),用于导入指定类的某个静态成员变量和静态方法

例如

import static com.wqlm.util.静态成员变量名
import static com.wqlm.util.静态方法名

当然,前提是这些 静态成员变量名静态方法名 是能访问到的