一、包(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程序