java中import,package的用法

简介:

有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 

太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 

的程式通通写到编译好的 .class 档案中,或是认為 import 跟 C/C++ 的 

#include 相似,实际上,这是错误的观念。

让我们先了解一下,Java 的 package 到底有何用处。

其实,package 名称就像是我们的姓,而 class 名称就像是我们的名字 

。package 名称有很多 . 的,就好像是复姓。比如说 java.lang.String,就 

是复姓 java.lang,名字為 String 的类别;java.io.InputStream 则是复姓 

java.io,名字為 InputStream 的类别。

Java 会使用 package 这种机制的原因也非常明显,就像我们取姓名一样 

,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取 

姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的 

困扰。相同的,全世界的 Java 类别数量,恐怕比台湾人口还多,而且还不断 

的在成长当中,如果类别不使用套件名称,那在用到相同名称的不同类别时, 

就会產生极大的困扰。幸运的是,Java 的套件名称我们可以自己取,不像人 

的姓没有太大的选择 ( 所以有很多同名同姓的 ),如果依照 Sun 的规范来取

套件名称,那理论上不同人所取的套件名称不会相同 ( 请参阅 "命名惯例" 

的相关文章 ),也就不会发生名称衝突的情况。

可是问题来了,因為很多套件的名称非常的长,在写程式时,会多打好多 

字,花费不少时间,比如说:

      java.io.InputStream is = java.lang.System.in;

     java.io.InputStreamReader isr= new java.io.InputStreamReader(is);

     java.io.BufferedReader br = new java.io.BufferedReader(isr);

 

实在是不美观又麻烦。於是,Sun 想了一个办法,就是 import。

这个 import 就是在程式一开头的时候,先说明程式中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在档案开头写:

      import java.lang.System;

     import java.io.InputStream;

     import java.io.InputStreamReader;

     import java.io.BufferedReader;

 

这几行说明了这四个姓名的类别,在程式中只用他的名字来称呼,所以当程式 

中提到 System 就是指 java.lang.System,而 InputStream 就是指 

java.io.InputStream,依此类推。於是原来的程式就变成:

      InputStream = System.in;

     InputStreamReader isr = new InputStreamReader(is);

     BufferedReader br = new BufferedReader(isr);

 

这样看起来是不是清爽多了呢?如果这些类别用的次数很多,那就更能体会到 

import 的好处了。可是这样还是不够,因為懒是人的天性,还是会有人觉得 

打太多 import 了也很浪费时间,於是 Sun 又提供了一个方法:

      import java.lang.*;

     import java.io.*;

 

意思就是,等一下程式中提到的没有姓名的类别,不是姓 java.lang,就是姓 

java.io,如果这两个裡面有同样名字的类别,而不幸的你又只用名字称呼这

个类别,那编译器仍然会跟你抱怨,因為它还是不知道你说的这个类别指那一 

个姓的类别。那可不可以再懒一点呢,只写:

      import java.*;

 

歷史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓 

java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 

先生吧。

為甚麼我一开始说 import 跟 #include 不同呢?因為 import 的功能 

到此為止,它不像 #include 一样,会将档案内容载入进来。import 只是请 

编译器帮你打字,让编译器把没有姓的类别加上姓,并不会把别的档案的程 

式码写进来。如果你想练习打字,可以不要使用 import,只要在用到类别的 

时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),跟使用 

import 完全没有甚麼两样。

另外,虽然人不可以太懒,但是 Sun 还是帮我们多偷了一点懒。因為 

java.lang 这个套件实在是太常太常太常用到了,几乎没有程式不用它的, 

所以不管你有没有写 import java.lang;,编译器都会自动帮你补上,也就 

是说编译器只要看到没有姓的类别,它就会自动去 java.lang 裡面找找看, 

看这个类别是不是属於这个套件的。所以我们就不用特别去 

import java.lang 了。

 

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

import导入声明可分为两中: 

1>单类型导入(single-type-import) 

例:import java.util.ArrayList; 

2>按需类型导入(type-import-on-demand) 

例:import java.util.*;

以这样两种方式导入包中的任何一个public的类和接口(只有public类和接口才能被导入)

*导入声明仅导入类型而不导入子包;这就是为什么称它们为单类型导入和按需类型导入声明的原因.

*导入的类或接口的简名(simple name)具有编译单元作用域.这表示该类型简名可以在导入语句所在的编译单元的任何地方使用.这并不意味着你可以使用该类型所有成员的简名,而只能使用类型自身的简名. 

例如: java.lang包中的public类都是自动导入的,包括Math和System类.但是,你不能使用简名PI()和gc(),而必须使用Math.PI()和System.gc().你不需要键入的是java.lang.Math.PI()和java.lang.System.gc().

程序员有时会导入当前包或java.lang包,这是不需要的,因为当前包的成员本身就在作用域内,而java.lang包是自动导入的.java编译器会忽略这些冗余导入声明(redundant import declarations).即使像这样 

import java.util.ArrayList; 

import java.util.*; 

多次导入,也可编译通过.编译器会将冗余导入声明忽略.

使用按需导入声明是否会降低Java代码的执行效率?绝对不会! 

Java编译器产生的类文件仅包含编译单元实际使用到的类或接口的符号引用.

这是否意味着你总是可以使用按需导入声明?是,也不是! 

在类似Demo的非正式开发中使用按需导入声明显得很有用. 

然而,有这四个理由让你可以放弃这种声明: 

1>编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计. 

2>命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定. 

3>说明问题:全名的使用是自说性的.毕竟高级语言的代码是给人看的. 

4>无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明.如果有命名冲突就会产生问题. 

Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到: 

在java.util.Properties类中的导入声明: 

import java.io.IOException; 

import java.io.printStream; 

import java.io.printWrite; 

import java.io.InputStream; 

import java.io.BufferedReader; 

import java.io.BufferedWriter; 

import java.util.Hashtable;

你可以看到有趣的是,她连java.util.Hashtable也导入,这可是在当前包中啊! 











本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1784052,如需转载请自行联系原作者
目录
相关文章
|
4天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
116 3
|
3月前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
239 4
|
3月前
|
Java 数据安全/隐私保护
Java 包(package)的使用详解
Java中的包(`package`)用于组织类和接口,避免类名冲突并控制访问权限,提升代码的可维护性和可重用性。通过`package`关键字定义包,创建相应目录结构即可实现。包可通过`import`语句导入,支持导入具体类或整个包。Java提供多种访问权限修饰符(`public`、`protected`、`default`、`private`),以及丰富的标准库包(如`java.lang`、`java.util`等)。合理的包命名和使用对大型项目的开发至关重要。
199 2
|
3月前
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
70 10
|
3月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
44 10
|
3月前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
53 1
|
4月前
|
前端开发 Java 编译器
【前端学java】java中的package与import(3)
【8月更文挑战第9天】java中的package与import
39 2
|
4月前
|
Java Maven 数据库
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
56 2