工作中的点点滴滴,慢慢积累。

Java的import语句

上一篇 / 下一篇  2007-01-10 17:47:41 / 个人分类:Java

以下文章属网上收集,不属于本人原创
51Testing软件测试网.\o K#[7s(L\b0G

程序员可以使用两种import语句:51Testing软件测试网3xP,Rm&~(`

51Testing软件测试网*Rfb6X/[;h*Sr1Hd

单类型导入(single-type-import),例如import java.io.File;51Testing软件测试网,yu,ol4c)]ge"G

51Testing软件测试网1K'[XB2@'q%fcv

按需类型导入(type-import-on-demand),例如 import java.io.*;

BXdqM p r`|d1N0

:_c0BK Q I0关于这两种导入类型大家各有所爱,众说纷纭。这里分析一下这两种导入类型的大致工作原理供大家参考。51Testing软件测试网^i6C R hVg z L8H

] kA E4X8[T1c0单类型导入比较好理解,仅仅导入一个public类或者接口。而对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。

,@8@'z^g,V q3dmi051Testing软件测试网$TF [.uj,Ydd

既然如此是不是就可以放心的使用按需类型导入呢?非也,非也。因为单类型导入按需类型导入对类文件的定位算法是不一样的。java编译器会从启动目录(bootstrap),扩展目录(extension)和用户类路径下去定位需要导入的类,而这些目录进仅仅是给出了类的顶层目录。编译器的类文件定位方法大致可以理解为如下公式:

B,h XBp ];_0

A%W3[E [G0顶层路径名 \ 包名 \ 文件名.class = 绝对路径

-@x ])u Un ~051Testing软件测试网8_%s(}.H7G ]:~S

对于单类型导入很简单,因为包明和文件名都已经确定,所以可以一次性查找定位。

EC6i];X%b[.~\0

fo|b1L/D]0对于按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:

~_tX~ R0

$[D5s$xP y,D g:N0package com;51Testing软件测试网1UT K@4@$[M.^1bW

:{(f/y9k3^ ~|0import java.io.*;51Testing软件测试网LR|%]+gIg JR@[|

51Testing软件测试网Uj-f+Uoh\

import java.util.*;

F o%M0i7E:k,J0

^%v;F(b%hs{v9P0当你的类文件中用到了File类,那么可能出现File类的地方如

\7Y)S.W5K.U R*^qg0_0

^$Q B'HWW`E0File  \\ File类属于无名包,就是说File类没有package语句,编译器会首先搜索无名包51Testing软件测试网.MgHuc*]

/VIeN`,b0com.File \\ File类属于当前包51Testing软件测试网ze#sA6N I~a

51Testing软件测试网"lQ;j:ui C9J

java.lang.File \\编译器会自动导入java.lang包

G|w8l1t!U(XkT(@O0

6d)c2o2m/_(NhG&L0java.io.File

`sfJ ~V051Testing软件测试网 ?*E`(FWB

java.util.File51Testing软件测试网.XEQh`S i$^

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

"Ls]#\P4C@6]oa/z*zB0

-qq Gk.rC,}0了解以上原理之后,我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度51Testing软件测试网.L0u2R;u1X2m#pk{

51Testing软件测试网/G/r:Ik`lt

查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:51Testing软件测试网"@ V!FU~6sw"|

51Testing软件测试网 PwZ9y:\cz

1。提高编译速度。

x:DQI"q1@'PU*Pc051Testing软件测试网tL0|0y:@S_|] m l

2。避免命名冲突。(例如:当你import java.awt.*;import java.util.*后,使用List的时候编译器将会出编译错误)

:LTj)W S C3B051Testing软件测试网}R~3j:?"_L,B*PZ

当然,使用单类型导入会使用你的import语句看起来很长。

'K"D Bl{,u `/q0

TAG: java Java

 

评分:0

我来说两句

日历

« 2023-07-08  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

我的存档

数据统计

  • 访问量: 15894
  • 日志数: 12
  • 建立时间: 2007-01-10
  • 更新时间: 2007-01-19

RSS订阅

Open Toolbar