CH01-面向对象

三大特性

封装

利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能的隐藏内部的细节,只保留一些对外接口使其与外部发生关系。用户无需知道对象内部的细节,但可以通过对象所提供的接口来访问对象。

优点:

  • 减少耦合:可以独立的开发、测试、优化、使用、理解、修改
  • 减少维护负担:可以更容易的被其他开发者理解,并且在调试的时候可以不影响其他模块
  • 有效的调节性能:可以通过剖析确定哪些模块影响了系统的性能
  • 提高软件的可重用性
  • 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的

继承

继承实现了 IS-A 关系,比如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得属于 Animal 的非私有的属性和方法。

继承应该遵循里氏替换原则,子类对象必须能够替换掉父类对象(可以直接将子类对象看做是父类对象)。

Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型

多态

多态分为编译时多态和运行时多态:

  • 编译时多态主要指方法的重载
  • 运行时多态指程序中定义的对象引用所指向的具体类型在运行期才确定

运行时多态有三个条件:

  • 继承
  • 覆写
  • 向上转型

类图

泛化关系

Java extend。

NAME

实现关系

Java implement。

NAME

聚合关系

表示整体由部分组成,但是整体和部分不是强依赖,整体不存在了部分还会存在。

NAME

组合关系

和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。

NAME

关联关系

表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就是可以确定的。因此也可以用一对一、一对多、多对一、多对多这种表述来表示。

比如学生和学校就是一种关联关系,一个学校可以有多个学生,但是一个学生只属于一个学校,因此这是一种多对一关系,在运行开始就能确定。

NAME

依赖关系

依赖关系是在运行中起作用的。A 类对 B 类的依赖关系主要有三种形式:

  • A 类是 B 类中的局部变量
  • A 类是 B 类方法中的参数
  • A 类向 B 类发送消息,从而影响 B 类
NAME

Vihicle 的 move 方法接收一个 MoveBehavior 对象作为参数来实现移动逻辑,而 MoveBehavior 可能的实现是向上或向下移动。

参考资料