java中有两种包的导入机制,总结如下:
单类型导入(single-type-import), 例如 import java.io.File;
按需类型导入(type-import-on-demand),例如 import java.io.*;
这里分析一下这两种导入类型的大致工作原理供大家参考。
单类型导入比较好理解,仅仅导入一个public类或者接口。
对于按需类型导入( import java.io.*; ),有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。
既然如此是不是就可以放心的使用按需类型导入呢?非也,非也。
因为单类型导入和按需类型导入对类文件的定位算法是不一样的。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*5=15次查找。
注意:如果在查找完成后,编译器发现了两个同名的类,那么就会报错。要删除你不用的那个类,然后再编译。
了解以上原理之后,我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。
查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:
1。提高编译速度。
2。避免命名冲突。(例如:当你import java.awt.*;import java.util.*后,使用List的时候编译器将会出编译错误)
当然,使用单类型导入会使用你的import语句看起来很长。
以上引用自 http://yuquan-nana.iteye.com/blog/83986
分享到:
相关推荐
java-package与import机制 java-package与import机制
最全的Java import的机制
Java深入历险(CH_05.package_与import_机制)
Java深度历险\CH_05.package与import机制,看完之后,让您对加载的路径更清晰
主要介绍了java的package和import机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
package与import机制 基本原则:为什么需要将Java文件和类文件切实安置到其所归属之Package所对应的相对路径下。 为什么要这样做呢?如果你在程序中,用到打包命令package,并且直接编译和执行该程序。
对JAVA内部机制的一个介绍
package与import机制 用Visual Studio.net来操控Java虚拟机 深入Java 2 SDK 深入类别载入器
import与package机制的探讨:撰写Java程序的人,绝对会遇到import与package机制。只要明白这个机制的运作原理,你会发现Java是一个设计优良的设计;Ant与Java;Java与Office;Visual Studio.net与Java;Java 2 SDK源...
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.text....
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { ...
java多线程机制: 例子 1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand(); //创建两个线程。 right=new Righthand();...
Java深度历险 深入Java 2 SDK 深入类别载入器 Java与MS Office 用Visual Studio.net操控Java虚拟机 package与import机制 Ant 附录A.Java 2 SDK原版码概观
import java.lang.reflect.Method; public class DumpMethods { public static void main(String args[]) throws Exception { // 加载并初始化命令行参数指定的类 Class<?> classType = Class.forName(args[0])...
import与package机制的探讨:撰写Java程序的人,绝对会遇到import与package机制。只要明白这个机制的运作原理,你会发现Java是一个设计优良的设计;Ant与Java;Java与Office;Visual Studio.net与Java;Java 2 SDK源...
经典java书籍,此书深入浅出地介绍java,配合大量的实验案例,读起来很轻松,读完之后对java内部机制能有深入的了解,使得java编程调试变得大为轻松。
1.在Java中,负责对字节代码解释执行的是____。 A、垃圾回收器 B、虚拟机 C、编译器 D、多线程机制 2.... A、Java语言的标识符...在 Java 中,由Java编译器自动导入,而无需在程序中用import导入的包是____。
反射机制用Java描述下载资料 import java.lang.reflect.Array; public class ArrayTest { public static void main(String[] args){ try{ //创建一个元素类型为String,长度为10的数组 Object arr=Array....
import与package机制的探讨:撰写Java程序的人,绝对会遇到import与package机制。只要明白这个机制的运作原理,你会发现Java是一个设计优良的设计;Ant与Java;Java与Office;Visual Studio.net与Java;Java 2 SDK源...
在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作... import java.io.Serializable; pub