java中import机制(指定import和import *的区别)

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语句看起来很长。

时间: 2024-10-09 13:49:10

java中import机制(指定import和import *的区别)的相关文章

Java中反射机制(Reflection)研究及源码演示

如下内容内容是关于 Java中反射机制(Reflection)研究及演示的内容. package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public static void main(String[] args) throws Exception { Class<?> tClass = Class.forName("java.lang.Class"

Java中Compareable和Comparator两种比较器的区别

Java中Compareable和Comparator两种比较器的区别 1.引言 在java这个处处是对象的世界里,对两个对象进行按某一属性进行比较是特别常见的需求.比如书店中的书按照价格比较,亦或者是学生按照成绩进行排名等等. 对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo()方法: 3.抛去需要被比较的类,在其外部自定义一个单独的对象比较器,继

Java中PhantomReference、WeakReference、SoftReference有什么区别?

Java中有多种引用类型,按照从强到弱的顺序分别如下: 强引用:就是最常见的引用,通过等号赋值就是强引用. 软引用:当内存不足时自动释放引用.一般应用于需要大量内存的缓存程序中. 弱引用:不阻止垃圾回收,当强引用或者软引用都消失时,即使存在弱引用内存也会被释放. 幽灵引用:只引用一个对象的"灵魂",幽灵引用是不能直接访问的,所以get方法永远返回null.这种引用能阻止JVM释放对象的内存,但是被引用的对象可以finalize.这东西有什么用呢?按照文档中的说法就是用于调整对象之间fi

深刻理解Java中的String、StringBuffer和StringBuilder的区别

首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先,它是线程安全的,即可以用于多线程编程中: 其次,String类的对象是不可变的,即在定义时就确定了,类似String str="Hello";str+="Java";的语句其实是生成了新的对象,只是我们未察觉到而已.但是注意在大量的字符串新建对象时消耗就很可观,这时必须考虑采用StringBuffer或StringBuilder,否

java中4种修饰符访问权限的区别及详解全过程

java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为public.protect.default.private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高. 下面详细讲述下它们的访问权限问题.(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况.) 首先在这里把它们的访问权限表示出来:

Java中微服务架构与传统架构的区别

Java中微服务架构与传统架构的区别 在聊微服务之前,先来看看传统架构的优缺点. 传统的 MVC 架构,所有的子系统都集成在一个很繁杂的 JVM 进程中. 优点: 这种单体架构的优点在于方便管理,所有代码在同一项目中,但是当需求越来越多,项目规模越来越大,其坏处也很明显. 缺点: 1.项目过于臃肿,部署效率低下 当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护.单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包.部署测试一次非常耗时.系统高可用性差,资

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

java中,return和return null有什么区别吗?

java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void! return 就是跳出方法...return null也是跳出方法并返回null.. 也就是说return null必须用在返回值不是void的方法里面..return可以用在任何方法里面 不要认为null就是没有值..null就是值..真正的没有值是..比如你String s;这个时候s是没有

Java中集合List,Map和Set的区别

Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Key不能重复 4.Set中的元素是无序的,不可重复的

java中static、final、static final的区别

final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值. final修饰的属性表明是一个常数(创建后不能被修改). final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承. 对于基本类型数据,final会将值变为一个常数(创建后不能被修改):但是对于对象句柄(亦可称作引用或者指针),fin