Java 包(package)详解
(转自:http://c.biancheng.net/view/940.html)
1.什么情况下需要包?
随着程序架构越来越大,类的个数也越来越多,管理程序中维护类名称也是一件很麻烦的事,尤其是一些同名问题的发生。有时,开发人员还可能需要将处理同一方面的问题的类放在同一个目录下,以便于管理。
为了解决上述问题,Java 引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。
2.包作用
包允许将类组合成较小的单元(类似文件夹),它基本上隐藏了类,并避免了名称上的冲突。包允许在更广泛的范围内保护类、数据和方法。你可以在包内定义类,而在包外的代码不能访问该类。这使你的类相互之间有隐私,但不被其他世界所知。
包的 3 个作用如下:
3.包定义
Java 中使用 package 语句定义包,package
语句应该放在源文件的第一行,在每个源文件中只能有一个包定义语句,并且
package 语句适用于所有类型(类、接口、枚举和注释)的文件。定义包语法格式如下:
package 包名;
Java 包的命名规则如下:
4.包导入
如果使用不同包中的其它类,需要使用该类的全名(包名+类名)。代码如下:
example.Test test = new example.Test();
其中,example
是包名,Test 是包中的类名,test 是类的对象。
为了简化编程,Java 引入了 import 关键字,import
可以向某个 Java 文件中导入指定包层次下的某个类或全部类。import
语句位于 package 语句之后,类定义之前。一个 Java 源文件只能包含一个 package 语句,但可以包含多个 import 语句。
使用 import 导入单个类的语法格式如下:
import 包名+类名;
上面语句用于直接导入指定类,例如导入前面的 example.Test 类,代码如下:
import example.Test;
使用 import 语句导入指定包下全部类的用法按如下:
import example.*;
上面
import 语句中的星号(*)只能代表类,不能代表包,表明导入 example 包下的所有类。
提示:使用星号(*)可能会增加编译时间,特别是引入多个大包时,所以明确的导入你想要用到的类是一个好方法,需要注意的是使用星号对运行时间和类的大小没有影响。
通过使用 import 语句可以简化编程,但 import 语句并不是必需的,如果在类里使用其它类的全名,可以不使用 import 语句。
Java
默认为所有源文件导入 java.lang 包下的所有类,因此前面在 Java 程序中使用 String、System 类时都无须使用 import 语句来导入这些类。但对于前面介绍数组时提到的 Arrays 类,其位于 java.util 包下,则必须使用 import 语句来导入该类。
在一些极端的情况下,import 语句也帮不了我们,此时只能在源文件中使用类全名。例如,需要在程序中使用 java.sql 包下的类,也需要使用 java.util 包下的类,则可以使用如下两行 import 语句:
import java.util.*;
import java.sql.*;
如果接下来在程序中需要使用 Date 类,则会引起如下编译错误:
Test.java:25:对Date的引用不明确,
java.sql中的类java.sql.Date和java.util中的类java.util.Date都匹配
上面错误提示:在 Test.java 文件的第 25 行使用了 Date 类,而 import 语句导入的 java.sql 和 java.util 包下都包含了 Date 类,系统不知道使用哪个包下的 Date 类。在这种情况下,如果需要指定包下的 Date 类,则只能使用该类的全名,代码如下:
// 为了让引用更加明确,即使使用了 import 语句,也还是需要使用类的全名
java.sql.Date d = new java.sql.Date();
5.系统包
Java
SE 提供了一些系统包,其中包含了 Java 开发中常用的基础类。在 Java 语言中,开发人员可以自定义包,也可以使用系统包,常用的系统包如表 1 所示。
表1 Java中常用的系统包 |
|
包 |
说明 |
java.lang |
Java 的核心类库,包含运行 Java 程序必不可少的系统类,如基本数据类型、基本数学函数、 |
java.io |
Java 语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等 |
java.util |
包含如处理时间的 Date 类,处理动态数组的 Vector 类,以及 Stack 和 HashTable 类 |
java.awt |
构建图形用户界面(GUI)的类库,低级绘图操作 Graphics 类、图形界面组件和布局管理 |
java.awt.image |
处理和操纵来自网上的图片的 Java 工具类库 |
java.wat.peer |
很少在程序中直接用到,使得同一个 Java 程序在不同的软硬件平台上运行 |
java.net |
实现网络功能的类库有 Socket 类、ServerSocket 类 |
java.lang.reflect |
提供用于反射对象的工具 |
java.util.zip |
实现文件压缩功能 |
java.awt.datatransfer |
处理数据传输的工具类,包括剪贴板、字符串发送器等 |
java.sql |
实现 JDBC 的类库 |
java.rmi |
提供远程连接与载入的支持 |
java. security |
提供安全性方面的有关支持 |
读者现在只需对这些包有一个大致印象即可,随着教程后面的介绍,读者会逐渐熟悉它们的用法。
6.自定义包
包的声明和使用非常简单,在了解基本语法之后,下面通过一个案例演示在 Java 程序中声明包,以及不同包之间类的使用。
1)创建一个名为 com.dao 的包。
2)向 com.dao 包中添加一个 Student 类,该类包含一个返回 String 类型数组的 GetAll() 方法。Student 类代码如下:
10. }
3)创建
com.test 包,在该包里创建带 main() 方法的
Test 类。
4)在 main() 方法中遍历 Student 类的 GetAll() 方法中的元素内容,在遍历内容之前,使用 import 引入 com.dao 整个包。完整代码如下:
13. }
5)运行上一步骤的代码进行测试,最终的输出结果如下:
学生信息如下:
李潘
邓国良
任玲玲
许月月
欧阳娜
赵晓慧