在前面的课程案例中,对包有了初步认识。在Java项目中建立的类都要放置在某一包内,不同功能的类文件被放入到不同的包中,包类似于Windows资源管理器的文件夹,对类文件进行分类管理(如按照功能划分类文件),同种类型的类文件放入到同一个包中,这样做的好处是易于管理和使用类文件。
和Windows资源管理器的文件夹一样,包也采用了树形目录的存储方式。同一个包中类名字是不同的,不同包中类的名字可以相同,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免类名字冲突。
Java API中的类库就采用了包机制进行层次式管理。例如,下图显示了其组织结构的一部分。

Java包逻辑结构
从上图可以看出,一个名为Java的包中又包含了两个子包:io包和lang包。lang包中包含了System、String、Object这三个类文件。事实上,Java包中既可以包含类文件,也可以包含子包,或同时包含两者。从逻辑上讲,包是一组相关类的集合,从物理上讲,同包即同目录。
包的创建和在包内创建类文件的操作,我们应该非常清楚了。在类文件中使用关键字“package”来声明该类属于某一个包。
例如在PCoreUnit2项目中,BusTest类代码如下:
package automobile;
/**
* @ClassName: BusTest
* @Description: 抽象类与接口(接口的继承)案例1
* @author 编程训练营
* @date
*
*/
public class BusTest {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 实例化Bus对象
Bus bus = new Bus();
// 调用接口方法
bus.run();
bus.speedUp();
bus.speedDown();
}
}上面BusTest类文件代码的第一条语句是“package automobile;”,表明BusTest类文件被放置在automobile包内。
PCoreUnit2项目的包逻辑结构如下图所示:

PCoreUnit2项目的包逻辑结构
PCoreUnit2项目有四个包,分别是automobile包、car包、math包、pci包,每个包内有多个类文件。
PCoreUnit2项目对应的文件目录结构如下图所示:

PCoreUnit2项目文件目录结构
从上图可以看出,PCoreUnit2项目的包逻辑与文件目录结构是一一对应的。
创建和使用包时需要注意如下几点:
(1) 包的名称一般为小写,包名尽量做到见名知意。例如:数学计算包名可以命名“math”,再如,绘图包可以命名“drawing”;
(2) 在创建包时,一次可以创建多层包。例如创建包时输入包名com.milihua. automobile,将会创建com包,在com包下创建milihua包,在milihua包下创建automobile包;
(2)在类中声明包时,使用package关键字;
(3)如果有包声明,包声明一定作为源代码的第一行。
使用import关键字导入包
为了使用不在同一个包中的类,需要在java程序使用import关键字导入这个类。前面的案例经常使用Scanner类获取用户的输入,Scanner类包含在Java API类库util包中,因此程序要使用Scanner类,就需要导入util包,导入util包语句如下:
import java.util.*;
该条语句意思是导入Java核心类库util包中的所有类,其中import是导入包关键字,Java.util是指Java核心类库中的util包,*是导入util包中的所有类。
更多导入包的例子:
//导入Java.util包中的Scanner类 import Java.util.Scanner; //导入Java.util包中的Date类 import Java.util.Date; //导入Java.net包中的所有类 import Java.net.*;
在Java代码中,import语句应位于package语句之后,类定义之前,可以有多条import语句。
在类内部使用其它包中的类。另外一个方法是在类代码中使用类的完全限定名称。例如,在类中要使用Scanner类,如果省略了导入Scanner的语句,则需要在使用Scanner类的位置使用Java.util.Scanner,也就是给出完整的类访问路径。
Java编译器默认为所有的Java程序引入了Java API的Java.lang 包中的所有的类。其中定义了一些常用类:System、String、Object、Math等。因此我们可以直接使用这些类,而不必显式引入。但使用其他包中的类时,则必须先引入、后使用。