使用包成员
组成包的类型称为包成员。
要从其包外部使用公共包成员,你必须执行以下操作之一:
通过其完全限定名称引用该成员
导入包成员
导入成员的整个包
每种情况都适用于不同的情况,如以下各节所述。
通过其完全限定名称引用包成员到目前为止,本教程中的大多数示例都通过简单名称引用类型,例如Rectangle和StackOfInts,如果你编写的代码与该成员位于同一个包中,或者已导入该成员,则可以使用包成员的简单名称。
但是,如果你尝试使用其他包中的成员并且尚未导入该包,则必须使用该成员的完全限定名称,该名称包括包名称,这是上一个示例中graphics包中声明的Rectangle类的完全限定名称。
graphics.Rectangle
你可以使用此限定名称来创建graphics.Rectangle的实例:
graphics.Rectangle myRect = new graphics.Rectangle();
限定名称不经常使用,重复使用名称时,重复键入名称会变得乏味,代码变得难以阅读,或者,你可以导入成员或其包,然后使用其简单名称。
导入包成员要将特定成员导入当前文件,请在任何类型定义之前在文件开头放置import语句,但在package语句之后(如果有),以下是从上一节中创建的graphics包导入Rectangle类的方法。
import graphics.Rectangle;
现在你可以通过简单名称引用Rectangle类。
如果你只使用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.DoubleWide和Rectangle.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.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 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的静态成员,这样你就不需要为类名称添加前缀Math,Math的静态成员可以多带带导入:
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通过删除类名重复使代码更具可读性。上一篇:创建和使用包 下一篇:管理源文件和类文件
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72949.html
嵌套类 Java编程语言允许你在另一个类中定义类,这样的类称为嵌套类,如下所示: class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两类:静态和非静态,声明为static的嵌套类称为静态嵌套类,非静态嵌套类称为内部类。 class OuterClass { ... stati...
包 本课程解释了如何将类和接口捆绑到包中,如何使用包中的类,以及如何安排文件系统以便编译器可以找到源文件。 创建和使用包 为了使类型更易于查找和使用,避免命名冲突和控制访问,程序员将相关类型的组捆绑到包中。 定义:包是一组提供访问保护和名称空间管理的相关类型,请注意,类型引用类、接口、枚举和注解类型,枚举和注解类型分别是特殊的类和接口,因此在本课中通常将类型简称为类和接口。 作为Java平台一部...
管理源文件和类文件 Java平台的许多实现依赖于分层文件系统来管理源文件和类文件,尽管Java语言规范不要求这样做,策略如下。 将类、接口、枚举或注解类型的源代码放在文本文件中,该文件的名称是类型的简单名称,其扩展名为.java,例如: //in the Rectangle.java file package graphics; public class Rectangle { ... ...
继承 在前面的课程中,你已经多次看到了继承,在Java语言中,类可以从其他类派生,从而从这些类继承字段和方法。 定义:从另一个类派生的类称为子类(也是派生类,扩展类或子类),派生子类的类称为超类(也是基类或父类)。 除了Object没有超类,每个类都有一个且只有一个直接超类(单继承),在没有任何其他显式超类的情况下,每个类都隐式地是Object的子类。 类可以从派生自类的类派生的类派生,依此类推,...
类的更多方面 本节介绍依赖于使用对象引用的类的更多方面以及你在前面的对象部分中了解到的点运算符。 从方法返回值 方法返回到调用它的代码。 完成方法中的所有语句。 到达return语句。 或抛出异常(稍后介绍)。 以先发生者为准。 你在方法声明中声明方法的返回类型,在方法体内,使用return语句返回值。 声明为void的任何方法都不返回值,它不需要包含return语句,但它可能会这样做,在这种...
阅读 3717·2021-10-11 10:59
阅读 1300·2019-08-30 15:44
阅读 3478·2019-08-29 16:39
阅读 2886·2019-08-29 16:29
阅读 1800·2019-08-29 15:24
阅读 807·2019-08-29 15:05
阅读 1264·2019-08-29 12:34
阅读 2302·2019-08-29 12:19