Java语言中,包(package)就是由若干相关类组成的一个分组,引入包机制的目的在于实现类的访问控制和命名空间管理。如果一个包中的类数目太多,可以继续进行细分,即包中再次创建包,这样具有层次性的包更合理,也更推荐。在 JDK 的内置 API 中提供了大量定义好的类,它们就是按照功能进行分包的,其中常用的包如下:
(1)java.lang 包含了Java语言程序设计的基础类
(2)java.awt 包含用于创建图形用户界面和绘制图形图像的相关类
(3)java.util 包含了集合、日期、国际化和各种实用工具类
(4)java.io 包含可提供数据输入/输出相关的类
(5)java.net 提供用于实现 java 网络编程相关的功能类
(6)java.sql 提供用于 java 访问数据库相关的功能类
注意,每一个包都是一个独立的命名空间(Naming Space),不同包中可以定义同名的类,而不必担心命名冲突。创建在包中的包称为子包。
Java 语言使用关键字 package 来声明包,其语法如下:
package pkgName[.pkgName2[.pkgName3...]];
其中,pkgName、pkgName2、pkgName3 为包名,按照 Java 编码习惯,包名应该是名词性单词或词组,所有字母小写。多层级包使用圆点进行分割,如:com.hxstrive.test 表示 com 包下面有子包 hxstrive,hxstrive 子包中又有子包 test。如果类需要使用包,package 语句必须作为 Java 源文件的第一条语句,前面可以有注释或空行,但不能有其他语句。如果没有指定 package 语句,则类属于同一个无名包。
示例:声明一个 com.hxstrive.test 包,并且在该包下面创建 Demo 类。
package com.hxstrive.test; public class Demo { public void show() { System.out.println("Demo show()"); } }
如果 Demo 类位于 D:/demo 目录下面,怎样去编译它们呢?有两种方式:
方式一:进入到 D:/demo 目录,运行 javac Demo.java 命令:
D:\demo>javac Demo.java
编译时生成的 Demo.class 文件会默认保存在当前源码路径下,需要我们手动创建名为 com/hxstrive/test 的目录路径,然后将 Demo.class 拷贝到 test 目录。
方式二:进入到 D:/demo 目录,运行 D:\demo> javac -d D:\demo Demo.java 命令:
D:\demo> javac -d D:\demo Demo.java
其中,“-d D:\demo”是传给 Java 编译器的参数,用于指定将此次编译的 .class 文件保存到 D:\demo 目录下。如果源文件中有 package 语句,则编译时会自动在 D:\demo 目录下面创建与包名同名的文件夹路径 com/hxstrive/test,即 Demo.class 的完整路径为 D:\demo\com\hxstrive\test\Demo.class。
如果要使用有名包中的类,首先将该字节码文件所在的顶层包对应的文件夹所在的路径加入到 CLASSPATH 变量中,然后在 Java 源文件开头使用 import 语句引入所需要的类。
import 语句语法格式如下:
import pkg[.pkg2...].(classname | *)
其中,pkg、pkg2 是需要引入类所在的包层次。classname 是要引入的具体类名,* 表示引入该包中所有的类。
示例:
package com.hxstrive; import com.hxstrive.test.Demo; public class TestPackage { public static void main(String[] args) { Demo demo = new Demo(); demo.show(); } } // 输出结果: //Demo show()
注意,如果需要引入的类和当前类在同一个包下面,则不需要 import 语句,例如:
package com.hxstrive.test; public class TestPackage { public static void main(String[] args) { Demo demo = new Demo(); demo.show(); } } // 输出结果: //Demo show()
如果在 D:\demo 目录下面存在 Demo.java(包 com.hxstrive.test) 和 TestPackage.java(包 com.hxstrive)源文件,使用 javac -d D:\demo *.java 命令进行编译:
D:\demo>javac -d D:\demo *.java
编译后,将在 D:\demo 目录下生成 class,如下:
D:\demo\com\hxstrive\test\Demo.class
D:\demo\com\hxstrive\TestPackage.class
紧接着运行 java com.hxstrive.TestPackage 命令运行 TestPackage 程序:
D:\demo>java com.hxstrive.TestPackage Demo show()
如果在 D:\demo 目录下面存在如下源文件:
D:\demo\com\hxstrive\test\Demo.java
D:\demo\com\hxstrive\TestPackage.java
此时,我们使用 javac -d d:\demo com/hxstrive/test/Demo.java 编译 Demo.java
D:\demo> javac -d d:\demo com/hxstrive/test/Demo.java
编译成功后,生成 D:\demo\com\hxstrive\test\Demo.class 字节码文件。
然后,使用 javac -d d:\demo com/hxstrive/TestPackage.java 编译 TestPackage.java
D:\demo> javac -d d:\demo com/hxstrive/TestPackage.java
编译成功后,生成 D:\demo\com\hxstrive\TestPackage.class 字节码文件。
最后,使用 java 命令运行 TestPackage,如下:
D:\demo> java com.hxstrive.TestPackage Demo show()