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

在使用诸如Date 类时 需要手动导入 import java. util. Date, 再比如使用File类时,也需要手动导入 import java. io. File。 但是在使用Object类、String类和 Integer类等时不需要手动导入, 而能直接使用,这是为什么呢?
这里先告诉读者一个结论:使用java. lang包下的所有类, 都不需要手动导入。另外介绍一下Java中的两种导包形式:
1)单类型导入(single-type-import), 例如import java. util. Date。
2)按需类型导人 (type-import-on-demand), 例如import java. util.
单类型导入比较好理解,编程所使用的各种工具默认都是按照单类型导入的,需要什么类便导人什么类,这种方式是导入指定的public类或者接口;
按需类型导入,比如 import java. util. * 可能看到后面的* 程序员会以为是导入java. util 包下的所有类, 其实并不是这样,Java会根据名字知道是按照需求导入,并不是导入整个包下的所有类。
Java 编译器会从启动目录(bootstrap) 扩展目录(extension) 和用户类路径去定位需要导人的类, 而这些目录仅给出了类的顶层目录,编译器的类文件定位方法大致可以理解为如下公式:
顶层路径名\包名\文件名.class=绝对路径
单类型导入可以导入包名和文件名,所以编译器可以一次性查找定位到所要的类文件。按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:

package com;import java.io.import java.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个,那么编译器就会进行3*5=15次查找。
如果在查找完成后,编译器发现了两个同名的类,那么就会报错。要先删除用户不用
的那个类,然后再编译。
所以可以得出这样的结论:

按需类型导入是绝对不会降低Java 代码的执行效率的,但会影响到Java代码的编译速度。所以在编码时最好是使用单类型导入,这样不仅能提高编译速度,也能避免命名冲突。
了解Java的两种导包类型后,再回到为什么可以直接使用Object类。上面代码中查找类文件的第③步,编译器会自动导人 java. lang包,那么就可以直接使用了。至于原因,因为用得多,提前加载了该包文件,且节省了资源。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值