|
6 | 6 |
|
7 | 7 | > 代码复用是面向对象编程(OOP)最具魅力的原因之一。 |
8 | 8 |
|
9 | | -对于像 C 语言等面向过程语言来说,“复用”通常指的就是“复制代码”。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕“类”(**Class**)来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 |
| 9 | +对于像 C 语言等面向过程语言来说,**复用**通常指的就是**复制代码**。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕**类**来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 |
10 | 10 |
|
11 | 11 | 如何在不污染源代码的前提下使用现存代码是需要技巧的。在本章里,你将学习到两种方式来达到这个目的: |
12 | 12 |
|
13 | | -1. 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(**Composition**),通过这种方式复用代码的功能,而非其形式。 |
| 13 | +1. 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(Composition),通过这种方式复用代码的功能,而非其形式。 |
14 | 14 |
|
15 | | -2. 第二种方式更为微妙。通过现有类创建新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(**Inheritance**)。**继承**是面向对象编程(**OOP**)的重要基础之一。更多功能相关将在[多态](./09-Polymorphism.md)(**Polymorphism**)章节中介绍。 |
| 15 | +2. 第二种方式更为微妙。通过现有类创建新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(Inheritance)。**继承**是面向对象编程(**OOP**)的重要基础之一。更多功能相关将在[多态](./09-Polymorphism.md)(Polymorphism)章节中介绍。 |
16 | 16 |
|
17 | 17 | 组合与继承的语法、行为上有许多相似的地方(这其实是有道理的,毕竟都是基于现有类型构建新的类型)。在本章中,你会学到这两种代码复用的方法。 |
18 | 18 |
|
19 | 19 | <!-- Composition Syntax --> |
20 | 20 | ## 组合语法 |
21 | | -在前面的学习中,“组合”(**Composition**)已经被多次使用。你仅需要把对象的引用(**object references**)放置在一个新的类里,这就使用了组合。例如,假设你需要一个对象,其中内置了几个String对象,两个基本类型(**primitives**)的属性字段,一个自定义Class的对象。对于非基本类型对象,将引用直接放置在Class中,对于基本类型属性字段则仅进行声明(**define**)。 |
| 21 | + |
| 22 | +在前面的例子中,我们已经多次使用了**组合**:仅需把对象的引用放在一个新类即可。假设我们现在需要创建一个对象:它包含多个**字符串类型**字段、**基本类型**字段以及一个**自定义类型**字段。对于非基本类型字段,将对象引用直接放入新类中,对于基本类型字段则直接声明。 |
| 23 | + |
| 24 | +```java |
22 | 25 | // reuse/SprinklerSystem.java |
23 | | -// Composition for code reuse |
| 26 | +// 代码复用之组合 |
24 | 27 | class WaterSource { |
25 | | -private String s; |
26 | | -WaterSource() { |
27 | | -System.out.println("WaterSource()"); |
28 | | -s = "Constructed"; |
29 | | -} |
30 | | -@Override |
31 | | -public String toString() { return s; } |
32 | | -} |
33 | | -public class SprinklerSystem { |
34 | | -private String valve1, valve2, valve3, valve4; |
35 | | -private WaterSource source = new WaterSource(); |
36 | | -private int i; |
37 | | -private float f; |
38 | | -@Override |
39 | | -public String toString() { |
40 | | -return |
41 | | -"valve1 = " + valve1 + " " + |
42 | | -"valve2 = " + valve2 + " " + |
43 | | -"valve3 = " + valve3 + " " + |
44 | | -"valve4 = " + valve4 + "\n" + |
45 | | -"i = " + i + " " + "f = " + f + " " + |
46 | | -"source = " + source; // [1] |
| 28 | + private String s; |
| 29 | + WaterSource() { |
| 30 | + System.out.println("WaterSource()"); |
| 31 | + s = "Constructed"; |
| 32 | + } |
| 33 | + |
| 34 | + @Override |
| 35 | + public String toString() { return s; } |
| 36 | + } |
| 37 | + |
| 38 | + public class SprinklerSystem { |
| 39 | + private String valve1, valve2, valve3, valve4; |
| 40 | + private WaterSource source = new WaterSource(); |
| 41 | + private int i; |
| 42 | + private float f; |
| 43 | + |
| 44 | + @Override |
| 45 | + public String toString() { |
| 46 | + return |
| 47 | + "valve1 = " + valve1 + " " + |
| 48 | + "valve2 = " + valve2 + " " + |
| 49 | + "valve3 = " + valve3 + " " + |
| 50 | + "valve4 = " + valve4 + "\n" + |
| 51 | + "i = " + i + " " + "f = " + f + " " + |
| 52 | + "source = " + source; // [1] |
| 53 | + } |
| 54 | + |
| 55 | + public static void main(String[] args) { |
| 56 | + SprinklerSystem sprinklers = new SprinklerSystem(); |
| 57 | + System.out.println(sprinklers); |
| 58 | + } |
47 | 59 | } |
48 | | -public static void main(String[] args) { |
49 | | -SprinklerSystem sprinklers = new SprinklerSystem(); |
50 | | -System.out.println(sprinklers); |
51 | | -} |
52 | | -} |
53 | | -/* Output: |
| 60 | +``` |
| 61 | + |
| 62 | +输出结果: |
| 63 | + |
| 64 | +``` |
54 | 65 | WaterSource() |
55 | 66 | valve1 = null valve2 = null valve3 = null valve4 = null |
56 | 67 | i = 0 f = 0.0 source = Constructed |
57 | | -*/ |
| 68 | +``` |
| 69 | +<!-- 此小节尚未翻译完全 --> |
58 | 70 |
|
59 | 71 | <!-- Inheritance Syntax --> |
60 | 72 | ## 继承语法 |
|
0 commit comments