包
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程序 |
