From 468d774c28b783b1b8c30147e05d000bb0eebc7e Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 14 Mar 2018 10:17:20 +0800 Subject: [PATCH] auto commit --- notes/面向对象思想.md | 100 ++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md index 042f7b4f..1b88525f 100644 --- a/notes/面向对象思想.md +++ b/notes/面向对象思想.md @@ -12,13 +12,21 @@ * [2.3 共同封闭原则](#23-共同封闭原则) * [2.4 稳定抽象原则](#24-稳定抽象原则) * [2.5 稳定依赖原则](#25-稳定依赖原则) -* [面向对象的三大特性](#面向对象的三大特性) +* [三大特性](#三大特性) * [1. 封装](#1-封装) * [2. 继承](#2-继承) * [3. 多态](#3-多态) * [UML](#uml) * [1. 类图](#1-类图) + * [1.1 继承相关](#11-继承相关) + * [1.2 整体和部分](#12-整体和部分) + * [1.3 相互联系](#13-相互联系) * [2. 时序图](#2-时序图) + * [2.1 定义](#21-定义) + * [2.2 赤壁之战时序图](#22-赤壁之战时序图) + * [2.3 活动图、时序图之间的关系](#23-活动图时序图之间的关系) + * [2.4 类图与时序图的关系](#24-类图与时序图的关系) + * [2.5 时序图的组成](#25-时序图的组成) * [参考资料](#参考资料) @@ -55,7 +63,7 @@ ### 1.3 里氏替换原则 -**子类实例应该能够替换掉所有父类实例。** +**子类对象必须能够替换掉所有父类对象。** 继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。 @@ -112,22 +120,21 @@ 包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。 -# 面向对象的三大特性 +# 三大特性 ## 1. 封装 -利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。 +利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。 封装有三大好处: -1. 良好的封装能够减少耦合。 -2. 类内部的结构可以自由修改。 -3. 可以对成员进行更精确的控制。 -4. 隐藏信息,实现细节。 +1. 减少耦合 +2. 隐藏内部细节,因此内部结构可以自由修改 +3. 可以对成员进行更精确的控制 以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。 -注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改使用的数据类型时,也可以在不影响客户端代码的情况下进行。 +注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。 ```java public class Person { @@ -147,7 +154,7 @@ public class Person { if(18 <= age && age <= 50) { System.out.println(name + " is working very hard!"); } else { - System.out.println(name + " can't work!"); + System.out.println(name + " can't work any more!"); } } } @@ -155,23 +162,27 @@ public class Person { ## 2. 继承 -继承实现了 **is-a** 关系,例如 Cat 和 Animal 就是一种 is-a 关系,因此可以将 Cat 继承自 Animal,从而获得 Animal 非 private 的属性和方法。 +继承实现了 **IS-A** 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。 -Cat 可以当做 Animal 来使用,也就是可以使用 Animal 引用 Cat 对象,这种子类转换为父类称为 **向上转型** 。 - -继承应该遵循里氏替换原则:当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有 is-a 关系。 +Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 **向上转型** 。 ```java Animal animal = new Cat(); ``` +继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。 + ## 3. 多态 -多态分为编译时多态和运行时多态。编译时多态主要指方法的重装,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。 +多态分为编译时多态和运行时多态。编译时多态主要指方法的重载,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。 -多态有三个条件:1. 继承;2. 覆盖父类方法;3. 向上转型。 +运行时多态有三个条件: -下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。 +1. 继承 +2. 覆盖 +3. 向上转型 + +下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。 ```java public class Instrument { @@ -202,54 +213,51 @@ public class Music { } } } - ``` - - # UML ## 1. 类图 -**1.1 继承相关** +### 1.1 继承相关 -继承有两种形式 : 泛化(generalize)和实现(realize),表现为 is-a 关系。 +继承有两种形式 : 泛化(Generalize)和实现(Realize),表现为 IS-A 关系。 -① 泛化关系 (generalization) +**泛化关系 (Generalize)** -从具体类中继承 +从具体类中继承。