From 64f8b532383bdf093687142321bf407dab2a0399 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 13 Apr 2019 23:42:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=20=E7=AC=AC8=E7=AB=A0-?= =?UTF-8?q?=E7=BB=84=E5=90=88=E8=AF=AD=E6=B3=95(=E6=9C=AA=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E5=AE=8C=E5=85=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/08-Reuse.md | 80 +++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/docs/book/08-Reuse.md b/docs/book/08-Reuse.md index 8fe7ad1..1695c01 100644 --- a/docs/book/08-Reuse.md +++ b/docs/book/08-Reuse.md @@ -6,55 +6,67 @@ > 代码复用是面向对象编程(OOP)最具魅力的原因之一。 -对于像 C 语言等面向过程语言来说,“复用”通常指的就是“复制代码”。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕“类”(**Class**)来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 +对于像 C 语言等面向过程语言来说,**复用**通常指的就是**复制代码**。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕**类**来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 如何在不污染源代码的前提下使用现存代码是需要技巧的。在本章里,你将学习到两种方式来达到这个目的: -1. 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(**Composition**),通过这种方式复用代码的功能,而非其形式。 +1. 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(Composition),通过这种方式复用代码的功能,而非其形式。 -2. 第二种方式更为微妙。通过现有类创建新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(**Inheritance**)。**继承**是面向对象编程(**OOP**)的重要基础之一。更多功能相关将在[多态](./09-Polymorphism.md)(**Polymorphism**)章节中介绍。 +2. 第二种方式更为微妙。通过现有类创建新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(Inheritance)。**继承**是面向对象编程(**OOP**)的重要基础之一。更多功能相关将在[多态](./09-Polymorphism.md)(Polymorphism)章节中介绍。 组合与继承的语法、行为上有许多相似的地方(这其实是有道理的,毕竟都是基于现有类型构建新的类型)。在本章中,你会学到这两种代码复用的方法。 ## 组合语法 -在前面的学习中,“组合”(**Composition**)已经被多次使用。你仅需要把对象的引用(**object references**)放置在一个新的类里,这就使用了组合。例如,假设你需要一个对象,其中内置了几个String对象,两个基本类型(**primitives**)的属性字段,一个自定义Class的对象。对于非基本类型对象,将引用直接放置在Class中,对于基本类型属性字段则仅进行声明(**define**)。 + +在前面的例子中,我们已经多次使用了**组合**:仅需把对象的引用放在一个新类即可。假设我们现在需要创建一个对象:它包含多个**字符串类型**字段、**基本类型**字段以及一个**自定义类型**字段。对于非基本类型字段,将对象引用直接放入新类中,对于基本类型字段则直接声明。 + +```java // reuse/SprinklerSystem.java -// Composition for code reuse +// 代码复用之组合 class WaterSource { -private String s; -WaterSource() { -System.out.println("WaterSource()"); -s = "Constructed"; + private String s; + WaterSource() { + System.out.println("WaterSource()"); + s = "Constructed"; + } + + @Override + public String toString() { return s; } + } + + public class SprinklerSystem { + private String valve1, valve2, valve3, valve4; + private WaterSource source = new WaterSource(); + private int i; + private float f; + + @Override + public String toString() { + return + "valve1 = " + valve1 + " " + + "valve2 = " + valve2 + " " + + "valve3 = " + valve3 + " " + + "valve4 = " + valve4 + "\n" + + "i = " + i + " " + "f = " + f + " " + + "source = " + source; // [1] + } + + public static void main(String[] args) { + SprinklerSystem sprinklers = new SprinklerSystem(); + System.out.println(sprinklers); + } } -@Override -public String toString() { return s; } -} -public class SprinklerSystem { -private String valve1, valve2, valve3, valve4; -private WaterSource source = new WaterSource(); -private int i; -private float f; -@Override -public String toString() { -return -"valve1 = " + valve1 + " " + -"valve2 = " + valve2 + " " + -"valve3 = " + valve3 + " " + -"valve4 = " + valve4 + "\n" + -"i = " + i + " " + "f = " + f + " " + -"source = " + source; // [1] -} -public static void main(String[] args) { -SprinklerSystem sprinklers = new SprinklerSystem(); -System.out.println(sprinklers); -} -} -/* Output: +``` + +输出结果: + +``` WaterSource() valve1 = null valve2 = null valve3 = null valve4 = null i = 0 f = 0.0 source = Constructed -*/ +``` + ## 继承语法