黑马程序员技术交流社区

标题: 关于何时需要导入包的问题 [打印本页]

作者: 袁培育    时间: 2012-4-20 09:10
标题: 关于何时需要导入包的问题
如题,我知道在自己要调用那些包里的类时就要导入该类所在的包,这些都是自己编写的包,那么jdk自带的包什么时候导入呢?学习String、StringBuffer时都没有导入java.lang.*,为什么在学习collection时要导入java.util.*呢?他们不都是jdk提供的包吗?
作者: 许飞翔    时间: 2012-4-20 09:18
其实String、StringBuffer也导入了java.lang.*,因为java.lang.*包是默认导入的,是一个例外。
作者: 张超超    时间: 2012-4-20 10:04
不管什么情况下只要用到了别的包中的类,都是需要到如相应的包的,只是String类是个常用的类,这里java官方就在你使用String类时,默认的导入了java.lang.*包。
在其他情况下,需要导入包时,你可以在编写完相应的类后,然后按快捷键:ctrl+shift+O,Eclipse就会自动的导入相应的包的。
另外在发个关于java包的:java中有两种包的导入机制, 总结如下:
  单类型导入(single-type-import), 例如import java. io. File;
  按需类型导入(type-import-on-demand), 例如 import java. io. *;
  关于这两种导入类型大家各有所爱, 众说纷纭。 这里分析一下这两种导入类型的大致工作原理供大家参考。
  单类型导入比较好理解, 仅仅导入一个public类或许接口。 而对于按需类型导入, 有人曲解为导入一个包下的所有类, 其实不然, 看名字就知道, 他只会按需导入, 也就是说它并非导入整个包, 而仅仅导入当前类需要运用的类。
  既然如此是不是就可以放心的运用按需类型导入呢?非也, 非也。 由于单类型导入和按需类型导入对类文件的定位算法是不一样的。 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代码的编译速度。
  查看JDK的源代码就知道SUN的软件工程师一般不会运用按需类型导入。 由于运用单类型导入至多有以下两点益处:
  1。 提高编译速度。
  2。 避免命名抵触。 (例如:当你import java. awt. *;import java. util. *后, 运用List的时分编译器将会出编译错误)
  当然,运用单类型导入会运用你的import语句看起来很长。文章由Gainreel内衣旗舰店整理,收集辛苦,希望能保留出处。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2