美文网首页工作生活源码系列
2019-06-29 jdk8的第一篇

2019-06-29 jdk8的第一篇

作者: 青衣书童 | 来源:发表于2019-06-29 21:05 被阅读0次

           最近一直在学习jdk源码,在网上看了结合源码讲解的内容千篇一律,很多看的云里雾里,有一天早上5点多的时候,被蚊子咬醒了,干脆起来看源码,感觉颇有些收获,心痒难耐,想着把它写出来,这样以学促写,同时以写促学,应该很不错吧,但是真正干起来,才发现挺难的,自己没有写技术专栏的经验,不知道从何下手。

           盘桓踌躇了几日,想起一位作家的经验说,写文章首先要能先下笔,然后才可能成,今天便大着胆子,先将自己学习中看到的能让人豁然开朗的,怦然心动感觉的东西,分享出来,也不分什么栏目章节,只写干货,废话少说,进入正题。

    1.为什么java.lang包下的类不需要手动导入?

    答:1).首先我们要搞清楚,什么是PATH、CLASSPATH和SOURCEPATH。

           作为java程序员,我们在开始学习java时候,第一步就会在自己的电脑里安装JDK,(以windows为例)然后在自己的电脑里设置环境变量path,配置JDK的bin目录,这个对应的就是PATH,我们配置的就是查找javac.exe的路径。javac命令就是用于编译代码,将.java文件编译为.class可执行文件。

    CLASSPATH对应的就是JVM的可执行文件.class

    SOURCEPATH用于指定对应的.java类原始码。

            2).java的两种导包形式:

             a.单类型导入:如import java.util.Date;

             b.按需类型导入:如import java.util.*;

    单类型导入比较好理解,这里不再赘述,主要讲讲按需类型导入,java编译器会从启动目录(bootstrap),扩展目录(extension)和用户类路径下去定位需要导入的类,而这些目录进仅仅是给出了类的顶层目录,编译器的类文件定位方法大致可以理解为如下公式:

    绝对路径 = 顶层路径名/包名/文件名.class 

    单类型导入我们知道包名和文件名,所以编译器可以一次性查找定位到所要的类文件。按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。

    packagecom;

    importjava.io.*;

    importjava.util.*;

      如果我们文件中使用到了 File 类,那么编译器会根据如下几个步骤来进行查找 File 类:

      ①、File       // File类属于无名包,就是说File类没有package语句,编译器会首先搜索无名包

      ②、com.File     // File类属于当前包,就是我们当前编译类的包路径

      ③、java.lang.File   //由于编译器会自动导入java.lang包,所以也会从该包下查找

      ④、java.io.File

      ⑤、java.util.File

    ......

    需要注意的地方就是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。假设此时的顶层路径有三个,那么编译器就会进行3*5=15次查找。

      如果在查找完成后,编译器发现了两个同名的类,那么就会报错。要删除你不用的那个类,然后再编译。

    所以我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。所以我们在编码时最好是使用单类型导入,这样不仅能提高编译速度,也能避免命名冲突。

      讲清楚Java的两种导包类型了,我们在回到为什么可以直接使用 Object 类,看到上面查找类文件的第③步,编译器会自动导入 java.lang 包,那么当然我们能直接使用了。至于原因,因为用的多,提前加载了,省资源。

    相关文章

      网友评论

        本文标题:2019-06-29 jdk8的第一篇

        本文链接:https://www.haomeiwen.com/subject/lkipcctx.html