Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
组成包的类型称为 package members (包成员)。
要从包外部使用 public
包成员,你必须执行以下操作之一:
每种情况都适用于不同的情况,如以下各节所述。
到目前为止,本教程中的大多数示例都通过简单名称引用类型,例如 Rectangle
和 StackOfInts
。如果你编写的代码与该成员位于同一个包中,或者已导入该成员,则可以使用包成员的简单名称。
但是,如果你尝试使用其他包中的成员并且尚未导入该包,则必须使用该成员的完全限定名称,该名称包括包名称。以下是上一个示例中 graphics
包中声明的 Rectangle
类的完全限定名称。
graphics.Rectangle
你可以使用此限定名称来创建 graphics.Rectangle
的实例:
graphics.Rectangle myRect = new graphics.Rectangle();
限定名可以不经常使用。但是,重复使用名称时,重复键入名称会变得乏味,且代码变得难以阅读。作为替代方案,你可以 import (导入) 成员或其包,然后使用其简单名称。
要将特定成员导入当前文件,请在任何类型定义之前在文件开头放置 import
语句,但在 package
语句之后(如果有)。以下是从上一节中创建的 graphics
包导入 Rectangle
类的方法。
import graphics.Rectangle;
现在,你可以通过简单名称引用 Rectangle
类。
Rectangle myRectangle = new Rectangle();
如果你只使用 graphics
包中的一些成员,这种方法很有效。但是如果从包中使用多种类型,则应导入整个包。
要导入特定包中包含的所有类型,请使用带有星号 (*)
通配符的 import
语句。
import graphics.*;
现在,你可以通过简单名称引用 graphics
包中的任何类或接口。
Circle myCircle = new Circle(); Rectangle myRectangle = new Rectangle();
import
语句中的星号只能用于指定包中的所有类,如此处所示。它不能用于匹配包中类的子集。例如,以下语句无法匹配 graphics
包中以 A
开头的所有类。
// does not work import graphics.A*;
相反,它会生成编译器错误。使用 import
语句,通常只导入单个包成员或整个包。
import
形式允许你导入封闭类的公共嵌套类。例如,如果 graphics.Rectangle
类包含有用的嵌套类,例如 Rectangle.DoubleWide
和 Rectangle.Square
,则可以导入 Rectangle
及其嵌套类,使用以下 两个 语句。
import graphics.Rectangle; import graphics.Rectangle.*;
Rectangle
。import
形式,即 static import statement,将在本节末尾讨论。
为方便起见,Java 编译器会自动为每个源文件导入两个完整的包:(1) java.lang
包和 (2) 当前包(当前文件的包)。
首先,包似乎是分层的,但它们不是。例如,Java API 包括 java.awt
包,java.awt.color
包,java.awt.font
包,以及 java.awt
开头的许多其他包。但是,java.awt.color
包,java.awt.font
包和其他 java.awt.xxxx
包 不包含 在 java.awt
中。前缀 java.awt
(Java Abstract Window Toolkit) 用于许多相关的包,以使关系明显,但不显示包含。
导入 java.awt.*
会导入 java.awt
包中的所有类型,但不会导入 java.awt.color
,java.awt.font
或任何其他 java.awt.xxxx
包。如果你计划使用 java.awt.color
中的类以及 java.awt
中的其他类,则必须导入包含所有文件的包:
import java.awt.*; import java.awt.color.*;
如果一个包中的成员与另一个包中的成员共享其名称,并且两个包都已导入,则必须通过其限定名称引用每个成员。例如,graphics
包定义了一个名为 Rectangle
的类。java.awt
包也包含一个 Rectangle
类。如果已导入 graphics
和 java.awt
,则以下内容不明确。
Rectangle rect;
在这种情况下,你必须使用成员的完全限定名称来准确指出你想要的 Rectangle
类。例如,
graphics.Rectangle rect;
在某些情况下,你需要频繁访问来自一个或两个类的静态最终字段(常量)和静态方法。反复对这些类的名称进行前缀可能会导致代码混乱。static import 语句为你提供了一种导入要使用的常量和静态方法的方法,这样你就不需要为其类的名称添加前缀。
java.lang.Math
类定义 PI
常量和许多静态方法,包括计算正弦,余弦,正切,平方根,最大值,最小值,指数等的方法。例如,
public static final double PI = 3.141592653589793; public static double cos(double a) { ... }
通常,要从另一个类中使用这些对象,需要使用类名前缀,如下所示。
double r = Math.cos(Math.PI * theta);
你可以使用 static import 语句导入 java.lang.Math 的静态成员,这样就不需要为类名 Math
添加前缀。Math
的静态成员可以单独导入:
import static java.lang.Math.PI;
或作为一个群体导入:
import static java.lang.Math.*;
导入后,可以无限制地使用静态成员。例如,之前的代码段将变为:
double r = cos(PI * theta);
显然,你可以编写自己的类,包含常用的常量和静态方法,然后使用 static import 语句。例如,
import static mypackage.MyConstants.*;