一、包(package)机制概述

1. 包机制提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题

2. Java允许将一组功能相关的类放在同一个包下,从而组成逻辑上的类库单元

3. 位于包中的每个类的完整类名都应该是包名和类名的组合

4. Java默认所有源文件导入java.lang包下的所有类

 

二、package关键字

1. 作用:将含有package语句“package 包名;”的Java源文件里定义的所有类放在package指定的包结构下

// 把Hello类放在lee包空间下
package lee; public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } }

2. 一旦在Java源文件中使用了package语句“package 包名;”,就意味着该源文件里定义的所有类都属于这个包

3. package语句必须作为源文件的第一条非注释性语句,且一个源文件只能指定一个包,即只能包含一条package语句

4. 如果没有显式指定package语句,则处于默认包下

5. Oracle建议使用公司Internet域名倒写来作为包名,例如公司的Internet域名是crazyit.org,则该公司的所有类都建议放在org.crazyit包及其子包下

6. 在实际企业开发中,还会在org.crazyit包下以项目名建立子包;如果项目足够大,则还会在项目名子包下以模块名建立模块子包;如果该模块下还包括多种类型的组件,则还会建立对应的子包

 

三、import关键字

1. 作用:向某个Java文件中导入指定包层次下某个类或全部类,这样在源文件中使用这些类时就可以省略包前缀(不用写包名)

// 导入单个类
import package.subpackage...ClassName;
import lee.sub.Apple;

// 导入指定包下全部类
import package.subpackage...*;
import lee.sub.*;

补:上面语句中的星号(*)只能代表类,不能代表包。

2. import语句应出现在package语句(如果有的话)之后、类定义之前

3. 一个Java源文件可以包含多个import语句

4. Java默认所有源文件导入java.lang包下的所有类

 

四、import static关键字

1. 作用:导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法

// 导入单个静态成员变量、方法
import static package.subpackage...ClassName.fieldName | methodName;

// 导入指定类的全部静态成员变量、方法
import static package.subpackage...ClassName.*;

补:上面语句中的fieldName、methodName和*都只能代表静态成员变量或方法名。

2. import static语句放在与普通import语句相同的位置,它们之间没有任何顺序要求

3. 使用import可以省略写包名,而使用import static则可以连类名都省略,它们都是用于减少程序中代码编写量的,只是导入的对象不一样而已

 

五、包机制带来的文件结构问题

1. 对于包含package语句的Java源文件,使用带-d选项的javac命令进行编译后会自动建立对应的文件结构来存放相应的class文件

【示例】在路径“D:\”下创建内容如下的“Hello.java”源文件,执行命令“javac -d . Hello.java”后,发现当前路径下并没有Hello.class文件,而是在当前路径下多了一个名为pck的文件夹,该文件夹下则有一个Hello.class文件。

package pck;

public class Hello
{
	public static void main(String[] args)
	{
	}
}

补:如果直接使用命令"javac Hello.java"来编译该文件,则将会在当前路径下生成一个Hello.class文件,而不会生成pck文件夹。但Hello.class必须放在pck文件夹下才是有效的,所以应尽量使用带-d选项的javac命令来编译。

注:很多初学者以为只要把生成的class文件放在某个目录下,这个目录名就成了这个类的包名。这个看法是错误的,不是有了目录结构,就等于有了包名。为Java类添加包必须在Java源文件中通过package语句指定,单靠目录名是没法指定的。

Java的包机制需要两个方面保证:①源文件里使用package语句指定包名;②class文件必须放在对应的路径下。

 

2. 假设某个应用中包含两个Hello类,这两个Hello类还对应两个Hello.class文件

    ①上列两个Hello.java文件在文件系统中必须分开存放才不会引起冲突

    ②上列两个Hello.class文件在文件系统中也必须分开存放

    ③把Java源文件放在与包名一致的目录结构下,但通常建议将源文件和class文件分开存放

  • 项目文件夹/src/pck/Hello.java
  • 项目文件夹/classes/pck/Hello.class

    ④位于包中的类,在文件系统中必须有与包名层次相同的目录结构

 

3. 同一个包中的类不必位于相同的目录下

    ①如有pck.Hello和pck.Halo两个类,它们完全可以一个位于C盘下某个位置,一个位于D盘下某个位置

    ②只要CLASSPATH环境变量中包含这两个路径,虚拟机会自动搜索CLASSPATH下的子路径,把它们当成同一个包下的类来处理

 

六、Java的常用包

Java的核心类都放在java包及其子包下,Java扩展的许多类都放在javax包及其子包下。这些实用类就是我们所说的API,Oracle按这些类的功能分别放在不同的包下。

  • java.lang:该包中包含了Java语言的核心类,如String、Math、System和Thread类等
  • java.util:该包中包含了Java的大量工具类/接口和集合框架类/接口,例如Arrays、List和Set等
  • java.net:该包中包含了Java网络编程相关的类/接口
  • java.io:该包中包含了Java输入/输出编程相关的类/接口
  • java.text:该包中包含了Java格式化相关的类
  • java.sql:该包中包含了Java进行JDBC数据库编程的相关类/接口
  • java.awt:该包中包含了抽象窗口工具集的相关类/接口,这些类主要用于构建图形用户界面程序
  • java.swing:该包中包含了Swing图形用户界面编程的相关类/接口,这些类可用于构建平台无关的GUI程序