Java™ 教程(使用包成员)

使用包成员

组成包的类型称为包成员。java

要从其包外部使用公共包成员,你必须执行如下操做之一:segmentfault

  • 经过其彻底限定名称引用该成员
  • 导入包成员
  • 导入成员的整个包

每种状况都适用于不一样的状况,如如下各节所述。ide

经过其彻底限定名称引用包成员

到目前为止,本教程中的大多数示例都经过简单名称引用类型,例如RectangleStackOfInts,若是你编写的代码与该成员位于同一个包中,或者已导入该成员,则可使用包成员的简单名称。工具

可是,若是你尝试使用其余包中的成员而且还没有导入该包,则必须使用该成员的彻底限定名称,该名称包括包名称,这是上一个示例中graphics包中声明的Rectangle类的彻底限定名称。code

graphics.Rectangle

你可使用此限定名称来建立graphics.Rectangle的实例:对象

graphics.Rectangle myRect = new graphics.Rectangle();

限定名称不常常使用,重复使用名称时,重复键入名称会变得乏味,代码变得难以阅读,或者,你能够导入成员或其包,而后使用其简单名称。教程

导入包成员

要将特定成员导入当前文件,请在任何类型定义以前在文件开头放置import语句,但在package语句以后(若是有),如下是从上一节中建立的graphics包导入Rectangle类的方法。接口

import graphics.Rectangle;

如今你能够经过简单名称引用Rectangle类。get

若是你只使用graphics包中的一些成员,这种方法颇有效,可是若是从包中使用多种类型,则应导入整个包。编译器

导入整个包

要导入特定包中包含的全部类型,请使用带有星号(*)通配符的import语句。

import graphics.*;

如今,你能够经过简单名称引用graphics包中的任何类或接口。

Circle myCircle = new Circle();
Rectangle myRectangle = new Rectangle();

import语句中的星号只能用于指定包中的全部类,如此处所示,它不能用于匹配包中类的子集,例如,如下内容与graphics包中以A开头的全部类都不匹配。

// does not work
import graphics.A*;

相反,它会生成编译器错误,使用import语句,一般只导入单个包成员或整个包。

另外一种不太常见的导入形式容许你导入封闭类的公共嵌套类,例如,若是graphics.Rectangle类包含有用的嵌套类(如Rectangle.DoubleWideRectangle.Square),则可使用如下两个语句导入Rectangle及其嵌套类。

import graphics.Rectangle;
import graphics.Rectangle.*;

请注意,第二个import语句不会导入Rectangle

另外一种不常见的导入形式是静态导入语句,将在本节末尾讨论。

为方便起见,Java编译器会自动为每一个源文件导入两个完整的包:java.lang包和当前包(当前文件的包)。

包的表观层次结构

首先,包彷佛是分层的,但它们不是,例如,Java API包括java.awt包,java.awt.color包,java.awt.font包以及许多以java.awt开头的包。可是,java.awt包中包含java.awt.color包、java.awt.font包和其余java.awt.xxxx包。前缀java.awt(Java抽象窗口工具包)用于许多相关的包,以使关系明显,但不显示包含。

导入java.awt.*将导入java.awt包中的全部类型,但它不导入java.awt.colorjava.awt.font或任何其余java.awt.xxxx包。若是你计划使用java.awt.color中的类和其余类型以及java.awt中的类,则必须导入这两个包使用其全部文件:

import java.awt.*;
import java.awt.color.*;

名称歧义

若是一个包中的成员与另外一个包中的成员共享其名称而且两个包都已导入,则必须经过其限定名称引用每一个成员,例如,graphics包定义了一个名为Rectangle的类,java.awt包还包含一个Rectangle类,若是已导入graphicsjava.awt,则如下内容不明确。

Rectangle rect;

在这种状况下,你必须使用成员的彻底限定名称来准确指出你想要的Rectangle类,例如:

graphics.Rectangle rect;

静态导入语句

在某些状况下,你须要频繁访问static final字段(常量)和来自一个或两个类的静态方法,反复对这些类的名称进行前缀可能会致使代码混乱,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的静态成员,这样你就不须要为类名称添加前缀MathMath的静态成员能够单独导入:

import static java.lang.Math.PI;

或做为一个组:

import static java.lang.Math.*;

导入后,能够无限制地使用静态成员,例如,以前的代码段将变为:

double r = cos(PI * theta);

显然,你能够编写本身的类,其中包含你常常使用的常量和静态方法,而后使用static import语句,例如:

import static mypackage.MyConstants.*;
很是谨慎地使用 static import,过分使用静态导入会致使代码难以阅读和维护,由于代码的读者不知道哪一个类定义了特定的静态对象,正确地使用, static import经过删除类名重复使代码更具可读性。

上一篇:建立和使用包

下一篇:管理源文件和类文件

相关文章
相关标签/搜索