一、什么是面向对象
面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。
对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相互作用传递信息,实现程序开发。
1.1、对象的概念
Java 是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。对象有以下特点:
- 对象具有属性和行为。
- 对象具有变化的状态。
- 对象具有唯一性。
- 对象都是某个类别的实例。
- 一切皆为对象,真实世界中的所有事物都可以视为对象。
对应在现实中可以这么理解,学生可以抽象成为一个对象,一一对应的话如下:
- 学生具有年龄、姓名、学号等属性,并具有学习的行为。
- 学生这个对象针对不同的人,例如张三、李四会有不同的变化状态
- 学生这个对象只能描述学生在抽象之后的程序世界里,不能描述老师
- 学生这个对象属于人(Person)类下的某个实例,人(Person)下还有很多的对象。
- 我们可以用对象的概念,描述现实世界的一切事物。
二、java的三大核心特性
1、封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
可以按照如下图进行理解
设计的时候可以将学生中实体封装起来,内部隐藏id这个属性。外部只允许调用公开的属性和方法。
- 属性是名字、学号、年龄、
- 行为为学习
优点:
- 减少耦合: 可以独立地开发、测试、优化、使用、理解和修改
- 减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
- 有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能
- 提高软件的可重用性
- 降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的
2、继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型 。
Animal animal = new Cat()
3、多态
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
例如:小猫小狗都是动物的子类,但是小猫会喵喵喵,小狗会汪汪汪。
多态分为编译时多态和运行时多态:
- 编译时多态主要指方法的重载
- 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
三、类(对象)之间的关系
描述类之间的关系可有使用UML类图表示。这里直接引用大话设计模式中1.11章节提供的UML类图作为示例。
类之间的关系,类与接口之间关系可以分一下几种
- 泛化关系(Generalization)
- 实现关系 (Realization)
- 聚合关系 (Aggregation)
- 组合关系 (Composition)
- 关联关系 (Association)
- 依赖关系 (Dependency)
1、泛化关系
泛化关系其实就是继承关系,在 Java 中使用 extends 关键字。
UML表示方式使用空心三角+实线表示
2、实现关系
用来实现一个接口,在 Java 中使用 implement 关键字。
UML表示方式使用空心三角+虚线
此处表示大雁实现了飞翔的接口,存在飞翔的行为。
3、聚合关系
表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。
UML表示方式:空心菱形+实线箭头
聚合表示一种弱的拥有关系,体现的A(雁群)对象可以包含B(大雁)对象,但B对象不是A的对象的有一部分
4、组合关系
和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了
UML中表示方式:实心菱形+实线箭头
组合是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。例如鸟和翅膀的关系。
6、关联关系
表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。
UML表示方式:实线箭头
7、依赖关系
和关联关系不同的是,依赖关系是在运行过程中起作用,动物生存需要在依赖于氧气和水,这个是需要在某一个场景下才能构成依赖。
UML表示方式:虚线箭头
参考资料
大话设计模式1.11章节PDF
Java 全栈知识体系