mirror of
https://github.com/LingCoder/OnJava8.git
synced 2026-08-24 23:13:28 +08:00
Merge pull request #191 from YngwieWang/patch-11
[hotfix] Make the statement more fluent and easy to understand
This commit is contained in:
@@ -153,7 +153,7 @@ Brass.play() MIDDLE_C
|
||||
|
||||
## 转机
|
||||
|
||||
运行程序后会看到 **Music.java** 的难点。**Wind.play()** 的输出结果正是我们期望的,但它看起来似乎不能产生我们所期望的结果。观察 `tune()` 方法:
|
||||
运行程序后会看到 **Music.java** 的难点。**Wind.play()** 的输出结果正是我们期望的,然而它看起来似乎不应该得出这样的结果。观察 `tune()` 方法:
|
||||
|
||||
```java
|
||||
public static void tune(Instrument i) {
|
||||
@@ -194,7 +194,7 @@ Shape s = new Circle();
|
||||
|
||||
这会创建一个 **Circle** 对象,引用被赋值给 **Shape** 类型的变量 s,这看似错误(将一种类型赋值给另一种类型),然而是没问题的,因此从继承上可认为圆(Circle)就是一个形状(Shape)。因此编译器认可了赋值语句,没有报错。
|
||||
|
||||
假设你调用了一个基类方法(在派生类中都被覆写):
|
||||
假设你调用了一个基类方法(在各个派生类中都被覆写):
|
||||
|
||||
```java
|
||||
s.draw()
|
||||
@@ -202,7 +202,7 @@ s.draw()
|
||||
|
||||
你可能再次认为 **Shape** 的 `draw()` 方法被调用,因为 s 是一个 **Shape** 引用——编译器怎么可能知道要做其他的事呢?然而,由于后期绑定(多态)被调用的是 **Circle** 的 `draw()` 方法,这是正确的。
|
||||
|
||||
下面的例子稍微有些不同。首先让我们创建一个可复用的 **Shape** 类库,基类 **Shape** 中建立了所有继承自 **Shape** 的类的共同接口——所有的形状都可以被绘画和擦除:
|
||||
下面的例子稍微有些不同。首先让我们创建一个可复用的 **Shape** 类库,基类 **Shape** 为它的所有子类建立了公共接口——所有的形状都可以被绘画和擦除:
|
||||
|
||||
```java
|
||||
// polymorphism/shape/Shape.java
|
||||
@@ -1252,4 +1252,4 @@ RTTI 不仅仅包括简单的转型。例如,它还提供了一种方法,使
|
||||
|
||||
<!-- 分页 -->
|
||||
|
||||
<div style="page-break-after: always;"></div>
|
||||
<div style="page-break-after: always;"></div>
|
||||
|
||||
Reference in New Issue
Block a user