`

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

分享到:
评论

相关推荐

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

    Java包导入机制是Java编程语言中的一个重要组成部分,它允许开发者从不同的源代码组织结构中引入所需的类和接口。本文将深入探讨两种主要的导入方式:单类型导入和按需类型导入,并讨论它们的工作原理和使用场景。 ...

    java源码包(包括sun包和具体导入步骤)

    然而,由于版权和稳定性的考虑,`sun`包在较新的Java版本中被隐藏或移除,因此能够获取并研究这些源码是十分珍贵的。 首先,我们需要了解如何在Eclipse中导入这些源码。以下是一步一步的导入步骤: 1. **创建或...

    tomcat源码导入myeclipse

    【标题】"Tomcat源码导入MyEclipse"是一个针对Java开发者的重要实践操作,它涉及到两个关键组件:Tomcat服务器和MyEclipse集成开发环境。...对于学习和研究Servlet容器的内部运作机制,这是一次非常有价值的学习经历。

    jpcap java抓包必需jar包

    jpcap作为Java中的网络抓包库,为开发者提供了一个强大且易用的工具,无论是在教学、研究还是实际项目中,都能发挥重要作用。通过jpcap,开发者无需关心底层平台的差异,只需专注于数据包的捕获和处理,极大地简化了...

    java底层核心rt包源代码

    Java的rt.jar是Java运行时环境(Runtime Environment)的核心库...总之,研究Java底层核心rt包的源代码,是提高Java技术水平的重要途径,它能帮助开发者更高效地编写、调试和优化Java应用程序,提升软件开发的专业性。

    java-onvif.zip_-baijiahao_ONVIF java_java onvif_java-onvif_refer

    在实际应用中,首先,你需要导入这个库到你的Java项目中,然后创建ONVIF客户端对象,连接到你的摄像机。接着,你可以调用相应的方法来执行上述任务。例如,你可以使用`DeviceService`类来获取设备信息,使用`...

    java.lang研究

    由于`java.lang`包在编译时自动导入,因此程序员无需显式引入。本章将详细探讨这个包中的关键类和接口,以及它们在Java程序中的作用。 首先,`java.lang`包包括了一些基本类型(如`Boolean`、`Long`、`Byte`、`...

    Excel导入通用类 源码

    在Java中,反射是一种强大的机制,允许程序在运行时检查和操作类、接口、字段和方法的信息。在Excel导入通用类中,反射用于动态地创建对象、调用方法和访问字段,使得我们可以处理各种不同类型的Excel数据,而无需为...

    Java源代码

    4. **java**: 这是最基础的Java包,包含了Java语言的基本类库,如`java.lang`、`java.util`和`java.io`等。`java.lang`包含所有Java程序都默认导入的基本类,如`Object`、`String`、`System`等;`java.util`提供了...

    java算法研究分析

    Java通过包管理和import语句来组织和导入类,使得代码管理更加有序。此外,Java有两类数据类型:基本数据类型和非基本数据类型。基本数据类型包括boolean、byte、char等,它们在声明时会自动创建对象,而非基本数据...

    海量分词研究版java接口

    在Java环境下,实现海量分词的研究版接口,可以为开发者提供高效、精准的分词能力,尤其对于处理大量文本数据时尤为重要。"AVGV7.5.0.50 海量分词"标签可能指的是一个特定版本的分词工具或库,其版本号为7.5.0.50,...

    比较常见的Java验证码(解压导入MyEclipse即可)

    通过深入研究这个示例,你不仅可以掌握Java验证码的生成,还能了解到图形处理、会话管理等相关知识,对于提升自己的Java Web开发技能大有裨益。同时,这也是一个很好的实践项目,可以帮助你理解理论知识在实际应用中...

    java开发的移植游戏“紫禁城”源代码,使用MyEclipse 10导入

    《紫禁城》是一款使用Java语言开发的移植游戏,其源代码可供开发者研究学习,以了解游戏开发的基本流程和技术细节。本项目适用于那些希望通过实践提升Java编程能力,尤其是对游戏开发感兴趣的开发者。以下是对该源...

    java jdk1.8 源码

    Java JDK 1.8源码是Java开发工具包的一个重要组成部分,它包含了Java语言的核心类库,对于深入理解和学习Java编程语言以及其运行机制至关重要。源码提供了对JVM(Java虚拟机)、类库和API的直接洞察,帮助开发者探究...

    dragonite-java,Java中的Dragonite项目主存储库.zip

    《Dragonite:Java中的高效UDP数据传输协议》 Dragonite是一款专为Java设计的开源项目,它是一个基于UDP(User Datagram...无论你是对网络协议感兴趣,还是正在寻找高性能的通信方案,Dragonite都值得深入研究和探索。

    phprpc.jar 包java 反序列化PHP工程demo

    通过深入研究"phprpc.jar 包java 反序列化PHP工程demo",开发者可以掌握Java和PHP间的数据交互技术,提升跨平台应用的开发能力。同时,这也有助于拓展对序列化机制和RPC通信的理解,为构建更复杂、高效的分布式系统...

    java mysql驱动jar包和zip源码

    如果你想要深入研究JDBC驱动的工作机制,或者想要根据自己的需求修改某些功能,这部分源码将会是宝贵的参考资料。 在实际开发中,确保使用的驱动版本与MySQL服务器版本兼容是非常重要的,因为不同版本的驱动可能...

    Java课件第一章java概述课件

    6. **共享包的定义和引用**:学习如何组织和导入不同包下的类。 7. **多态的实现和管理**:探讨接口、抽象类和多态的实现方式。 8. **异常处理**:理解Java异常处理机制,包括try-catch-finally语句块。 9. **GUI...

    JAVA相关课件PPT

    3. **包与导入**:Java中的包机制有助于管理类和接口,`import`关键字用于引入其他包中的类。 4. **异常处理**:Java异常处理是通过try-catch-finally语句块来实现的,用于捕获和处理程序运行时可能遇到的问题。 5...

Global site tag (gtag.js) - Google Analytics