`

Java包导入机制的解析总结

阅读更多

java中有两种包的导入机制,总结如下:

单类型导入(single-type-import),例如import java.io.File;

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

关于这两种导入类型大家各有所爱,众说纷纭。这里分析一下这两种导入类型的大致工作原理供大家参考。

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

既然如此是不是就可以放心的使用按需类型导入呢?非也,非也。因为单类型导入和按需类型导入对类文件的定位算法是不一样的。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://www.simpleframework.net/simple/news/v.jsp?__news_beanId=0457345649_01078129255&__news_Id=2123

分享到:
评论

相关推荐

    Java包导入机制的研究与解析

    Java包导入机制的研究与解析 Java包导入机制的研究与解析 Java包导入机制的研究与解析

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    3.2.4 使用反射机制的步骤 导入Jjava.lang.relfect 包需 遵循以下3三个步骤: 第一步是获得你想操作的类的 java.lang.Class 对象; 第二步是调用诸如 getDeclaredMethods 的方法; 第三步使用 反射API 来...

    Java思维导图xmind文件+导出图片

    理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper ...

    Java类加载机制浅析

    目录 1、装载(Load) 2、链接(Link)  2.1、验证(Verify)  2.2、准备(Prepare) ...形成可以虚拟机直接使用的Java类型,即java.lang.Class   1、装载(Load)  查找和导入class文件 (1)通过一个类的全限定名

    JAVA 范例大全 光盘 资源

    第9章 Java异常处理与反射机制 183 实例73 运用throws、throw、try与catch 183 实例74 throws声明异常的实例 185 实例75 自定义异常类 187 实例76 使用finally避免资源漏洞 189 实例77 反射机制 191 第10章 I/...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    全书一共被压缩为5个rar,这是第二个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本...21.5.2 资源包 623 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    全书一共被压缩为5个rar,这是第三个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本...21.5.2 资源包 623 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    全书一共被压缩为5个rar,这是第四个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本...21.5.2 资源包 623 ...

    我是如何通过反射机制写一个通用excel导入导出的【上篇–导入】

    快一年没写推文了,感觉肚子里也积了点东西,今天就搞一搞个人觉得还是挺酷的东西–结合反射机制搞一个通用Excel导入,通用导出功能。 想了解下反射api的使用可以看下JAVASchool的说明:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    全书一共被压缩为5个rar,这是第五个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本...21.5.2 资源包 623 ...

    mybatis-book::books:《 Mybatis3原始码深度解析》随书原始码

    前言4第1篇Mybatis3源码7第1章构建Mybatis源码环境7 1.1 Mybatis3简介7 1.2环境准备7 1.3获取Mybatis源码8 1.4导入Mybatis源码到IDE 10 1.5 HSQLDB数据库简介13 1.6本章小结16第2章JDBC规范详解17 2.1 JDBC API简介...

    《Android系统源代码情景分析》

    5.10.2 Java服务接口的定义和解析 5.10.3 Java服务的启动过程 5.10.4 Java服务代理对象的获取过程 5.10.5 Java服务的调用过程 第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 ...

    Android系统源代码情景分析-罗升阳-源码

    5.10.2 Java服务接口的定义和解析 5.10.3 Java服务的启动过程 5.10.4 Java服务代理对象的获取过程 5.10.5 Java服务的调用过程 第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 ...

    Scala程序设计(第2版)

    4.13 总结关于模式匹配的评价 111 4.14 本章回顾与下一章提要 111 第5章 隐式详解 112 5.1 隐式参数 112 5.2 隐式参数适用的场景 115 5.2.1 执行上下文 115 5.2.2 功能控制 115 5.2.3 限定...

    Hadoop实战(第2版)

    数据逻辑.2 将数据导入导出Hadoop.2.1 导入导出的关键要素2.2 将数据导入Hadoop .2.2.1 将日志文件导入Hadoop技术点1 使用Flume 将...自动复制文件到HDFS 的机制技术点3 使用Oozie 定期执行数据导入活动...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    技术点2 自动复制文件到HDFS 的机制 技术点3 使用Oozie 定期执行数据导入活动 2.2.3 从数据库中拉数据 技术点4 使用MapReduce 将数据导入数据库 技术点5 使用Sqoop 从MySQL 导入数据 2.2.4 HBase 技术...

    Python编程入门经典

    7.2 包 106 7.3 模块和包 108 7.3.1 将所有内容引入当前 作用域 108 7.3.2 重新导入模块和包 109 7.4 测试模块和包的基础知识 111 7.5 本章小结 112 7.6 习题 112 第8章 文件和目录 115 8.1 文件对象 115 8.1.1 编写...

    ProjectLocationUpdater:该Eclipse插件添加了一个属性页,可通过编辑工作区中的“ .location”文件来更新项目位置。

    ) ProjectLocationUpdater还允许使用符号链接来设置项目的路径,而无需在存储它们之前进行解析。 (使用Eclipse导入向导时,所有符号链接都将得到解决。)背景一些项目依赖于外部构建工具。 因此,它们需要将工作...

    asp.net知识库

    深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署 ASP.NET 2.0 Security FAQs Asp.net 2.0功能体验,细节之Web控件(一) 隐藏控件 ...

Global site tag (gtag.js) - Google Analytics