File tree Expand file tree Collapse file tree 1 file changed +3
-3
lines changed
Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Original file line number Diff line number Diff line change @@ -210,13 +210,13 @@ Cleanser dilute() apply() scrub()
210210
211211这演示了一些特性。首先,在 ** Cleanser** 的 ` append() ` 方法中,使用 ` += ` 操作符将字符串连接到 ** s** ,这是 Java 设计人员“重载”来处理字符串的操作符之一 (还有 + )。
212212
213- 第二,** Cleanser** 和 ** Detergent** 都包含一个 ` main() ` 方法。你可以为每个类创建一个 ` main() ` ; 这允许对每个类进行简单的测试。当你完成测试时,不需要删除 ` main() ` ; 你可以将其留在以后的测试中。即使程序中有很多类都有 ` main() ` 方法,惟一运行的只有在命令行上调用的 ` main() ` 。这里,当你使用 ** java Detergent** 时候,就调用了 ` Detergent.main() ` 。但是你也可以使用 ** java Cleanser** 来调用 ` Cleanser.main() ` ,即使 ** Cleanser** 不是一个公共类。即使类具只有包访问权 ,也可以访问 ` public main() ` 。
213+ 第二,** Cleanser** 和 ** Detergent** 都包含一个 ` main() ` 方法。你可以为每个类创建一个 ` main() ` ; 这允许对每个类进行简单的测试。当你完成测试时,不需要删除 ` main() ` ; 你可以将其留在以后的测试中。即使程序中有很多类都有 ` main() ` 方法,惟一运行的只有在命令行上调用的 ` main() ` 。这里,当你使用 ** java Detergent** 时候,就调用了 ` Detergent.main() ` 。但是你也可以使用 ** java Cleanser** 来调用 ` Cleanser.main() ` ,即使 ** Cleanser** 不是一个公共类。即使类只具有包访问权 ,也可以访问 ` public main() ` 。
214214
215215在这里,` Detergent.main() ` 显式地调用 ` Cleanser.main() ` ,从命令行传递相同的参数(当然,你可以传递任何字符串数组)。
216216
217217** Cleanser** 中的所有方法都是公开的。请记住,如果不使用任何访问修饰符,则成员默认为包访问权限,这只允许包内成员访问。因此,如果没有访问修饰符,那么包内的任何人都可以使用这些方法。例如,** Detergent** 就没有问题。但是,如果其他包中的类继承 ** Cleanser** ,则该类只能访问 ** Cleanser** 的公共成员。因此,为了允许继承,一般规则是所有字段为私有,所有方法为公共。(受保护成员也允许派生类访问;你以后会知道的。)在特定的情况下,你必须进行调整,但这是一个有用的指南。
218218
219- ** Cleanser** 的接口中有一组方法: ` append() ` 、` dilute() ` 、` apply() ` 、` scrub() ` 和 ` toString() ` 。因为 ** Detergent** 是从 ** Cleanser** 派生的(通过 ** extends** 关键字),所以它会在其接口中自动获取所有这些方法,即使你没有在 ** Detergent** 中看到所有这些方法的显式定义。你那么 ,可以把继承看作是复用类。如在 ` scrub() ` 中所见,可以使用基类中定义的方法并修改它。在这里,你可以在新类中调用基类的该方法。但是在 ` scrub() ` 内部,不能简单地调用 ` scrub() ` ,因为这会产生递归调用。为了解决这个问题,Java的 ** super** 关键字引用了当前类继承的“超类”(基类)。因此表达式 ` super.scrub() ` 调用方法 ` scrub() ` 的基类版本。
219+ ** Cleanser** 的接口中有一组方法: ` append() ` 、` dilute() ` 、` apply() ` 、` scrub() ` 和 ` toString() ` 。因为 ** Detergent** 是从 ** Cleanser** 派生的(通过 ** extends** 关键字),所以它会在其接口中自动获取所有这些方法,即使你没有在 ** Detergent** 中看到所有这些方法的显式定义。那么 ,可以把继承看作是复用类。如在 ` scrub() ` 中所见,可以使用基类中定义的方法并修改它。在这里,你可以在新类中调用基类的该方法。但是在 ` scrub() ` 内部,不能简单地调用 ` scrub() ` ,因为这会产生递归调用。为了解决这个问题,Java的 ** super** 关键字引用了当前类继承的“超类”(基类)。因此表达式 ` super.scrub() ` 调用方法 ` scrub() ` 的基类版本。
220220
221221继承时,你不受限于使用基类的方法。你还可以像向类添加任何方法一样向派生类添加新方法:只需定义它。方法 ` foam() ` 就是一个例子。` Detergent.main() ` 中可以看到,对于 ** Detergent** 对象,你可以调用 ** Cleanser** 和 ** Detergent** 中可用的所有方法 (如 ` foam() ` )。
222222
@@ -507,7 +507,7 @@ PlaceSetting constructor
507507
508508### 保证适当的清理
509509
510- Java 没有 C++ 中析构函数的概念,析构函数是在对象被销毁时自动调用的方法。原因可能是,在Java中,通常是忘掉而不是销毁对象,从而允许垃圾收集器根据需要回收内存。通常这是可以的,但是有时你的类可能在其生命周期中执行一些需要清理的活动。初始化和清理章节提到,你不能知道垃圾收集器何时会被调用 ,甚至它是否会被调用。因此,如果你想为类清理一些东西,你必须显式地编写一个特殊的方法来完成它 ,并确保客户端程序员知道他们必须调用这个方法。最重要的是——正如在"异常"章节中描述的——你必须通过在 ** finally ** 子句中放置此类清理来防止异常。
510+ Java 没有 C++ 中析构函数的概念,析构函数是在对象被销毁时自动调用的方法。原因可能是,在Java中,通常是忘掉而不是销毁对象,从而允许垃圾收集器根据需要回收内存。通常这是可以的,但是有时你的类可能在其生命周期中执行一些需要清理的活动。初始化和清理章节提到,你无法知道垃圾收集器何时会被调用 ,甚至它是否会被调用。因此,如果你想为类清理一些东西,必须显式地编写一个特殊的方法来完成它 ,并确保客户端程序员知道他们必须调用这个方法。最重要的是——正如在"异常"章节中描述的——你必须通过在 ** finally ** 子句中放置此类清理来防止异常。
511511
512512请考虑一个在屏幕上绘制图片的计算机辅助设计系统的例子:
513513
You can’t perform that action at this time.
0 commit comments