java的import总结

2020/12/21

前言

看java8实战的时候看到很多类似于这样的处理

image-20210624200118873

两个高亮处自己调用函数

很是好奇,后来才知道原来import static可以导入包的静态成员,这样就可以不用类名然后引用出来,可以直接在代码里面使用。这样一想确实项目中constant里面常量(例如项目redis中的key常量)经常静态导入…果然基础不牢地动山摇…一直在用但是都不知道,所以特意想要总结关于import并且在此记录一下。

lang包-默认导入

常见的类型例如Long、String等因为用的非常多,可以说一个类里面大概率会用到的类,jdk是放到java.lang包下面,其中lang是language,这个包下面是java的语言基础。所以lang包是默认导入的,这是不需要自己导入的。

导包形式

单类型导包

单类型导入比较好理解,我们大部分都是按照类型导包,…当然我们大部分都是编译器帮我们导包,大部分的编译器都是默认单类型导包,需要什么类便导入什么类

```import java.util.List;``

按需导包

按需类型导入,比如import java.util.*,*号相当于通配了,这样按照包的需求导入,而不是按照单类型导入,值得注意的是看到通配,大家会误以为java.util包下所有类都导入了,实际上不是这样的整个通配只是指明导入类型的时候搜索目录而已。这对代码执行速度是没有任何影响的,影响到的是编译速度,因为需要花费更多的时间查找,下面介绍编译时如何找类。

编译器加载类

java编译器会从bootstrap、extension、system路径下去定位需要导入的类,这些目录都是顶层目录,编译器会确定一个绝对路径,确定的方法如下

顶层目录→包名→类名(文件名.class)

单类型导入中因为知道包名和文件名,所以绝对路径直接确定,只需要查找一次就可以找到所要的类文件。

按需导入则稍微麻烦一点,因为你的类名是不确定的,所以编译器需要进行排列组合,列出所有的绝对路径的可能

例如我们需要导入List包, 但是我们按需导入了两个通配包

import java.util.*;
import java.sql.*;
public static void main(String[]args){
	List<Integer> list = Arrays.asList(1, 2, 3);   
}

那么编译器会根据下面的步骤来查找List类

  1. 先搜索无名包,就是看看没有声明package的包有没有List的类
  2. 再搜索当前包下,有没有List类
  3. 然后再看java.lang.List能不能找到(这个是默认导的,所以也会检查)
  4. 然后再看java.util.List能不能找到
  5. 注意,前面其实已经找到了,但是编译器还会继续找,java.sql.List

基本就是会把所以通配的这个都拼凑一遍绝对路径,把所有可能都查找完,当然找到了两个,则编译器就会抛出错误。

静态导入

使用import static来替代import可以静态导入。上面的单类型和按需都都可以使用,静态导入可以把导入的类中静态的类导入当前类中(因为静态类不需要生成对象,加载类的时候都初始化好了,放在方法区中)。然后你在这个类中就可以直接使用方法名调用静态方法(就类似于在这个类中写的方法一样,直接使用不再需要使用类名.静态方法名)

这样的方法好处当然是可以简化一些操作,例如一些常量可能本来就很长,加上类名,如果重名的话可能还需要加入包名,一个引用名就两行代码。使用静态导入方便和美观很多。

这样做的缺点是静态导入可能会让代码更加难以阅读,有其实导入方法的时候,类名.静态方法名,类名和方法名是相辅相成的,只光秃秃的方法在不熟悉的情况下,很难见名知意;如果导入两个类都用同一个静态方法或者静态成员变量则会报错,例如包装类中都有MAX_VALUE

后言

可以看到平时编译器自动帮我们完成的导入都有这么多内容,可见学习道阻且长。其实平时自己整理包的导入也是非常重要的。因为需求变更问题,因为人员安排问题,公司项目有两百多行的导入代码,看着可怕…拖着心累。我建议大家除了养成良好的448代码格式化习惯以外,也可以追求一下代码优化导入习惯。

image-20210625162603484

intellij优化导入快捷键

(转载本站文章请注明作者和出处 没有气的汽水



┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├ 文章已经完啦, 想要第一时间收到文章更新可以关注↓ ┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘

Post Directory






下面是评论区,欢迎大家留言探讨或者指出错误哈