包
1. Java包的作用及性质
Java允许将一组功能相关的类放在同一个包(package)下,从而组成逻辑上的类库单元。
语法:如果希望把一个类放在指定的包结构下,应该在 Java 源程序的第一个非注释行放置如下格式的代码:
package packageName; // 定义Java源程序的从属包
一个源文件只能指定一个包,即只能包含一条package
语句,该源文件中可以定义多个类,这意味着这些类将全部位于该包下。
如果没有显式指定package
语句,则处于无名包下,这在实际企业开发中这通常不应该出现。
包名本身必须是独一无二的,包命名方式的建议:
- 将机构的 Internet 域名的反序作为包名的前缀;
- 如果包名中有任何不可用于标识符的字符,用下划线替代;
- 如果包名中的任何部分与关键字冲突,使用后缀下划线;
- 若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,使用前缀下划线。
2. 包的目录结构:
Java规定,位于包中的类,在文件系统中也必须有与包名层次相同的目录结构,如对于lee
包中的Hello.class
这个文件,应该先建立一个名为lee
的文件夹,再将Hello.class
放入这个目录下。
然而,上述规定并没有作强校验,同一个包中的类不必位于相同的目录下。例如有lee.Person
和lee.PersonTest
两个类,它们完全可以一个位于C盘,一个位于D盘,只要让CLASSPATH
环境变量里包含这两个路径即可,JVM会自动搜索CLASSPATH
下的子路径,把它们当成同一个包下的类来处理。
编译器在编译源文件的时候不检查目录结构。

注意,Java不像Python一样有了目录结构就等于有了包名,为Java类添加包必须在Java源文件中通过package
语句指定。
3. 包的引用
同一个包下的类可以自由访问,无须添加包前缀。
从编译器的角度来看,嵌套的包之间没有任何关系,例如java.util
包与java.util.jar
包毫无关系,每一个包都是独立的类集合。因此,父包和子包中的类互相引用时不能直接使用,仍需添加完整的包前缀。
为了简化包的引用,Java引入了import
关键字。
对于编译器而言,编译器不仅要查找类,而要查看源文件是否比类文件新。
4. import语句
import
可以向某个Java文件中导入指定包层次下某个类或全部类,import
语句应该出现在package
语句之后(如果有的话)、类定义之前。
import package.subpackage…Classname; // 导入某包下的单个类
import package.subpackage…*; // 导入某包下的全部类
- 上面
import
语句中的星号*
只能代表类,不能代表包。因此使用import parentPackage.*;
语句时,它表明导入父包下的所有类,但父包下的子包中的类不会被导入。此时如仍需导入子包中的类,应该使用import parentPackage.childPackage.*;
语句。 - Java默认为所有源文件导入了
java.lang
包下的所有类,因此在Java程序中使用String, System
类时无须使用import
语句。 - 当需要同时使用多个包中的同名类时,就不能使用相应的
import
语句了,这会造成编译错误,此时就只能使用该类的全名。
5. import static语句
import static
称作静态导入,其导入指定类的某个/全部静态成员变量、方法(注意,根据使用特性,import static
每次只能指定一个类)。
// 单个指定
import static package.subpackage…ClassName.fieldName | methodName;
// 导入全部
import static package.subpackage…ClassName.*
import static
导入之后,便可以在程序中直接使用被导入的静态成员变量或静态方法。示例:
package com.chuan;
import static java.lang.Math.PI;
import static java.lang.Math.pow;
public class TestImportStatic {
public static void main(String[] args){
System.out.println(PI); // 3.141592653589793
double num = pow(2, 10);
System.out.println(num); // 1024.0
}
}
6. Java源代码的结构
package 语句; // 0或1个,必须放在文件开头
import | import static 语句; // 0或N个,必须放在所有类定义之前
public ClassDefinition | InterfaceDefination | EnumDefinition; // 0或1个:public类、接口或枚举定义
ClassDefinition | InterfaceDefinition | EnumDefinition; // 0或N个:普通类、接口或枚举定义
在Java中,一个源代码文件称为一个编译单元,一个编译单元由三部分组成:
- 所属包的声明(若省略,则属于默认包);
import
语句,用于导入外部包;- 类和接口的声明。
一个编译单元中只允许有一个public
类,这个public
类要和文件名一致。但一个编译单元中可以有多个类,其他类一般用于辅助这个public
类。但一个编译单元中的所有类经过编译后,无论是否是public
类,都会独立地产生一个.class
文件。
7. Java常用包名
Java的核心类都放在java包及其子包下,Java扩展的许多类都放在javax包及其子包下。
包名 | 含义 |
---|---|
java.lang | 包含Java语言核心类,使用这个包下的类无须使用import 语句,系统自动导入。如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 | 包含抽象窗口工具集(Abstract Window Toolkit)的相关类/接口,它们主要用于构建GUI程序 |
java.swing | 包含Swing GUI编程的相关类/接口,这些类用于构建平台无关的GUI程序 |