最近一直在学习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 包,那么当然我们能直接使用了。至于原因,因为用的多,提前加载了,省资源。
网友评论