Java包的定义和使用
包(Package)机制是 Java 中管理类的重要手段。在不同的 Java 源文件中可能会出现名称相同的类,如果用户想区分这些类,就需要使用包名。
使用包名可以有效地区分名称相同的类,当不同源文件中的两个类的名称相同时,可以通过它们隶属于不同的包进行区分。
包对于类,相当于文件夹对于文件的作用。
借助包还可以将自己定义的类与其他类库中的类分开管理。Java 中的基础类库就是使用包管理的,如 java.util 包和 java.sql 包等。
在不同的包中,类的名称可以相同,如 java.util.Date 类和 java.sql.Date 类,这两个类的名称都是 Date,但是分别属于 java.util 包和 java.sql 包,因此能够同时存在。用户可以非常方便地通过“包路径.类名”的方式来访问类或接口。
package 语句应该放在源文件的第一行,在每个源文件中只能有一条包定义语句。另外,package 语句适用于所有类型(类、接口、枚举和注释)的文件。
定义包的语法格式如下:
一般先采用倒序域名来定义包结构,再将所有的类和接口分类存放在指定的包中,如 package cn.edu.yjy;。包定义的结构和编译后生成的文件夹结构是一一对应的。
【实例】包的应用。
图 1 在IDEA软件包资源视图中查看包
在 Java 中,引入包的语法格式如下:
import 语句必须放在所有类定义之前,用来引入指定包的类或接口。
Java 编译器默认为所有的 Java 程序引入 Java.lang 包中所有的类,因此,用户可以直接使用 java.lang 包中的类而不必显式引入。
如果引入两个名称相同的类,那么只能用包名+类名来显式调用相关类,例如:
【实例】引入名称相同的类的处理。
下面几个包是 Java 中的常用包,在后续章节中会经常用到这些包中的类。
使用 java.lang 包中的类不需要显式使用 import 语句引入,而是由解释器自动引入的。
使用包名可以有效地区分名称相同的类,当不同源文件中的两个类的名称相同时,可以通过它们隶属于不同的包进行区分。
包对于类,相当于文件夹对于文件的作用。
借助包还可以将自己定义的类与其他类库中的类分开管理。Java 中的基础类库就是使用包管理的,如 java.util 包和 java.sql 包等。
在不同的包中,类的名称可以相同,如 java.util.Date 类和 java.sql.Date 类,这两个类的名称都是 Date,但是分别属于 java.util 包和 java.sql 包,因此能够同时存在。用户可以非常方便地通过“包路径.类名”的方式来访问类或接口。
包的定义
Java 中使用 package 语句定义包。package 语句应该放在源文件的第一行,在每个源文件中只能有一条包定义语句。另外,package 语句适用于所有类型(类、接口、枚举和注释)的文件。
定义包的语法格式如下:
package 包名1[.包名2[.包名3...]];包名 1 ~ 包名 3 都是组成包名的一部分,并且用“.”连接。包名应该是合法的标识符,并且遵守 Java 包的命名规范,即所有字母都是小写的。
如果在源文件中没有定义包,那么类、接口、枚举和注释类型将被放在无名包[也称为默认包(Default Package)]中。注意,Java 中不允许用户程序使用“java”作为包名的第一部分。
一般先采用倒序域名来定义包结构,再将所有的类和接口分类存放在指定的包中,如 package cn.edu.yjy;。包定义的结构和编译后生成的文件夹结构是一一对应的。
【实例】包的应用。
//包名为chapter3,对应的文件夹存储在当前项目的 src/main/java文件夹下 package chapter3; public class Test { public static void main(String[] args) { System.out.println("hello world!"); } }定义好包之后,包采用层次结构管理类、接口、枚举和注释类型,如下图所示,在 IDEA 软件包资源视图中查看包。
图 1 在IDEA软件包资源视图中查看包
包的引入
Java 中的一个类可以访问其所在包中其他所有的类,如果需要访问其他包中的类,那么可以使用 import 语句引入包。引入包的操作通常也称为导包操作。在 Java 中,引入包的语法格式如下:
import 包名1[.包名2[.包名3]...].类型名|*;“包名.类型名”形式只引入具体类型,“包名.*”采用通配符,表示引入这个包中所有的类型。但从编程规范性上来说,提倡明确引入类型名,即采用“包名.类型名”形式,这样可以提高程序的可读性。
import 语句必须放在所有类定义之前,用来引入指定包的类或接口。
Java 编译器默认为所有的 Java 程序引入 Java.lang 包中所有的类,因此,用户可以直接使用 java.lang 包中的类而不必显式引入。
如果引入两个名称相同的类,那么只能用包名+类名来显式调用相关类,例如:
Java.util.Date date = new java.util.Date();
【实例】引入名称相同的类的处理。
package chapter3; import java.sql.Date; // 导入java.sql包中的Date类 import java.util.Date; // 导入java.util包中的Date类 public class Test { public static void main(String[] args) { // 使用java.sql包中的Date类创建对象now1 Date now1; // 使用java.util包中的Date类创建对象now2 java.util.Date now2 = new java.util.Date(); // 打印now2对象的值 System.out.println(now2); } }运行结果为:
Tue Apr 18 12:34:56 UTC 2024
常用的包
Java 提供了 130 多个包,Java 的核心类都放在 java 包及其子包下,Java 扩展的许多类都放在 javax 包及其子包下。这些实用类也就是常说的 API,按照这些类的功能分别放在不同的包下。下面几个包是 Java 中的常用包,在后续章节中会经常用到这些包中的类。
1) java.lang包
java.lang 包中包含 Java 的核心类,如 Object、Class、String、包装类和 Math 等,以及包装类 Boolean、Character、Integer、Long、Float 和 Double。使用 java.lang 包中的类不需要显式使用 import 语句引入,而是由解释器自动引入的。