diff --git a/docs/book/08-Reuse.md b/docs/book/08-Reuse.md index baad9ac250b521c842d0f3450aac641bd9bae01e..bdb2d1966d4e8e908dfb8546e681a5863854e3da 100644 --- a/docs/book/08-Reuse.md +++ b/docs/book/08-Reuse.md @@ -200,8 +200,7 @@ public class Detergent extends Cleanser { } } /* Output: -Cleanser dilute() apply() Detergent.scrub() scrub() -foam() +Cleanser dilute() apply() Detergent.scrub() scrub() foam() Testing base class: Cleanser dilute() apply() scrub() */ @@ -867,9 +866,9 @@ public class Wind extends Instrument { `tune()` 方法接受了一个 **Instrument** 类型的引用。但是,在 **Wind** 的 `main()` 方法里,`tune()` 方法却传入了一个 **Wind** 引用。鉴于 Java 对类型检查十分严格,一个接收一种类型的方法接受了另一种类型看起来很奇怪,除非你意识到 **Wind** 对象同时也是一个 **Instrument** 对象,而且 **Instrument** 的 `tune` 方法一定会存在于 **Wind** 中。在 `tune()` 中,代码对 **Instrument** 和 所有 **Instrument** 的派生类起作用,这种把 **Wind** 引用转换为 **Instrument** 引用的行为称作*向上转型*。 -该术语是基于传统的类继承图:图最上面是根,然后向下铺展。(当然你可以以任意方式画你认为有帮助的类图。)于是,**Wind.java** 的类图是: +该术语是基于传统的类继承图:图最上面是根,然后向下铺展。(当然你可以以任意方式画你认为有帮助的类图。)于是,**Shape.java** 的类图是: -![Wind 类图](../images/1561774164644.png) +![Shape 类图](../images/1561774164644.png) 继承图中派生类转型为基类是向上的,所以通常称作*向上转型*。因为是从一个更具体的类转化为一个更一般的类,所以向上转型永远是安全的。也就是说,派生类是基类的一个超集。它可能比基类包含更多的方法,但它必须至少具有与基类一样的方法。在向上转型期间,类接口只可能失去方法,不会增加方法。这就是为什么编译器在没有任何明确转型或其他特殊标记的情况下,仍然允许向上转型的原因。