java的包导入机制总结与剖析

java中有两种包的导入机制

总结如下:

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

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

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

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

  既然如此是不是就可以放心的使用按需类型导入呢?No. 因为单类型导入和按需类型导入对类文件的定位算法是不一样的。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语句看起来很长。

时间: 2024-08-26 01:46:59

java的包导入机制总结与剖析的相关文章

4.8-全栈Java笔记:包机制

包机制是java中管理类的重要手段. 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于,文件夹对于文件的作用. package 我们通过package实现对类的管理,package的使用有两个要点: 1.通常是类的第一句非注释性语句. 2.包名:域名倒着写即可,再加上模块名,便于内部管理类. [示例1]package的命名举例 com.sun.test; com.oracle.test; com.bjsxt.gao.test; co

JDK_API剖析之java.net包

为实现网络应用程序提供类.(按照字母顺序排序) 1.Authenticator 抽象类 自1.2开始有 无父类和接口 Authenticator 类表示懂得如何获得网络连接验证的对象.通常,它通过提示用户输入信息来完成此操作.应用程序通过重写子类中的 getPasswordAuthentication() 使用此类.此方法通常使用各种 getXXX() 访问器方法获取关于请求验证的实体的信息.然后,它必须通过与用户交互或者某些其他非交互手段获取用户名和密码.之后凭据将以 PasswordAuth

Hbase的极限测试经验之java项目的jar包导入

Hbase的极限测试的内容是把之前编过的网站的后台数据库改成hbase即可. 我很快就在hbase数据库中建完表,也把关于操作数据库的函数写好了. 当我调试时,发现在jsp中的操作数据库的函数都不能用. 提示我与没有找到与hbase的类,可是我当时已经通过Build Path的方式把与Hbase有关的所有jar包导入项目. 然后我在控制台测试这些函数,可以使用,没有报错,我就纳闷了. 我就一直卡到测试结束,一直没有解决. 等考试结束,我问了大佬,这种情况怎么解决. 他们告诉我Dynamic We

java通过poi包导入Excel

使用Apache POI包导入Excel时是需要根据行和列取到对应的值,因此取值时需要知道该列所对应的值应存放到对象的那个字段中去,表格出现变动就会变的比较麻烦,因此此处使用自定义注解的方式,在对象中标明该属性所对应的表头,从程序中遍历表头找到与之对应的单元格,方便数据的导入. 所需的jar包:(用了一下工具类,因此多导入了两个包) <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&

JDK_API剖析之java.util包

Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构. 一.接口 1.Collection<E> 接口 自1.2开始有 继承Iterable<E> Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 collection 是有序的,而另一些则是无序的.JDK 不提供此接口的任何直接 实现:它提供更具

深入研究Java类装在机制

目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定义类加载器:深入理解,对于理解编译原理也有很大帮助. 二.了解类装载机制,在我们项目开始中的应用 在项目中,我们可以使用自定义类加载器,可以帮助我们做如下操作: (1)加密.java代码很容易被反编译,如果你需要把自己的代码进行加密,可以先将编译后的代码用某种加密算法加密,然后实现自己的类加载器,负

九:Java之包

Java包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 一.包的作用 java中"包"的引入的主要原因是java本身跨平台特性的需求.因为java中的所有的资源也是以文件方式组织,这其中主要包含大量的类文件需要组织管理.java中同样采用了目录树形结构.虽然各种常见操作系统平台对文件的管理都是以目录树的形式的组织,但是它们对目录的分隔表达方式不同,为了区别于各种平台,java中采用了"."来分隔目录. 1 把功能相似或相关的类

如何理解和使用Java package包

Java中的一个包就是一个类库单元,包内包含有一组类,它们在单一的名称空间之下被组织在了一起.这个名称空间就是包名.可以使用import关键字来导入一个包.例如使用import java.util.*就可以导入名称空间java.util包里面的所有类.所谓导入这个包里面的所有类,就是在import声明这个包名以后,在接下来的程序中可以直接使用该包中的类.例如: [java] view plain copy import java.util.* public class SingleImport

Java:静态导入

静态导入 importStatic 当类重名时,需要指定具体的包名. 当方法重名时,需要指定具体的类或对象名. 举例如下: import java.util.*; import static java.util.Arrays.*;//导入Arrays这个类中的所有静态成员,调用该类静态方法时,直接调用 import static java.lang.System.*;//导入System这个类中的所有静态成员,调用该类静态方法时,直接调用 /* packa demo.class; packb d