相比于面向过程,面向对象可以更好的抽象
现实中的实体,抽象为概念,并且,将其应用于程序,使得所编写的代码可读性大大提高
为什么这样说呢? -------->>> 抽象的意义
概念的定义
对概念的清晰定义
,能够更好的理解概念所具备的共有属性,并与原有知识进行关联(知识之间往往具有很强的关联性)
如果感觉自己的思路混乱,往往是因为对概念的理解只有一种大概的模糊性
,尝试去提出问题,通过问题,将概念理清晰
好处?
对面向对象的理解
有何好处?
看源码的时候,可以站在一种全局的视角,不仅可以知道技术的实现,还可以意识到该技术为什么这样实现
新技术的诞生与流行,往往在于替代或弥补原有技术的不足
面向对象相对于面向过程有什么好处?或者说,面向对象,弥补了面向过程的哪些不足?
抽象
先来理解下抽象,抽象可分为 adj、n、v
abstract:
- adj
- based on
general ideas
and not on any particular real person, thing or situation - existing in
thought
or as anidea
but not having a physical reality
- based on
- n
- a short piece of writing containing the
main ideas
in a document
- a short piece of writing containing the
- v
- to remove sth from somewhere
- to make a written summary of a book, etc.
thought: something that you think of or remember
idea: a plan, thought or suggestion, especially about what to do in a particular situation
抽象:从对象中,抽取出共有的特性(可作为名词、动词)
抽象的过程,得到了抽象的结果
该过程为:根据实体 — 提取 >>> 概念(共性)
抽象的意义 —— 简化细节
假设我们身边的一切都是用制造材料加以描述的:空调不是“空调”,而是“由金属和塑料做成的物体”;书不是“书”,而是“由纤维和墨做成的物体”
沟通时我们也不用“空调”和“书”这样的词汇,而是“金属和塑料做成的物体”和“纤维和墨做成的物体”。这样的做法,十分影响效率
通过抽象,塑造“空调”和“书”这样的概念,能够极大的提高我们的沟通效率
以及思维秩序
程序可以理解为是人们构建的一个虚拟世界
为了提高编程人员的工作效率,使得虚拟世界
能够像现实世界
那样,充满着像“空调”和“书”这样的概念
而面向对象,正是构建与现实世界
相似的虚拟世界
的工具
抽象 —— 能够对复杂进行封装
马车、自行车、汽车、飞机:效率越高,概念越抽象(内部隐藏更多细节)
对复杂事物的封装,伴随的抽象概念的提出;但复杂被封装后,使得绝大部分人只享受复杂带来的好处,却不必去关心所封装的复杂
函数和类之间,代码提取的区别
面向过程中,对于代码提取,依赖于函数
而在面向对象中,可以利用到类
那么,类
的与函数
的区别是什么?
类
The term “class” is etymologically derived from the Latin classis, which was used by census takers to categorize citizens by wealth in order to determine military service obligations.
census: the process of officially counting sth, especially a country’s population, and recording various facts
术语 “class” 在词源上源于拉丁语,人口普查的时候,会根据公民所拥有的财富,对其进行分类,以确定其是否应该服兵役
class
- a group of people, animals or things that have
similar characteristics or qualities
类可以理解为分类
,在面向对象中,具有相同属性
的概念
,可以提取到一个类
中,这是函数所不具备的
类中有字段和方法
类中的方法,类比于函数
:输入的参数
—> 执行相应的逻辑操作
—> 返回结果
(不同参数 --> 不同结果)
对象与实例
- object: a thing that can be seen and touched, but is not alive
- instance: a particular example or case of sth 具体的例子
- particular: used to emphasize that you are referring to one individual person, thing or type of thing and not others
对象是一种泛称,而实例往往与类联系在一起
对象具有唯一标识,包括属性和方法
对象:面对的具象;实例:实在的例子
对象的引入,使得可以在软件中模拟显示世界;针对问题进行编程
函数和类的生命周期
函数的生命周期为:在函数执行完成之后,将会从栈中弹出
类具备函数中所没有的字段
,使用类实例化之后的对象,会保留在堆中,而不是从栈中弹出
类中的字段
类中字段的存在,带给了类哪些功能,而这些功能是函数所不具备的?
对象能够得到保留,那么,可以利用字段,去⭐保存一些数据或状态值💾
字段
可实现与函数中的参数
相同的功能,于是,假设你将字段
看成参数
,那么,也就是说,一个类中,封装了参数和行为
那这样有什么好处呢?⭐实现了参数的复用,类似于全局变量的效果,但是通常来说,字段服务于当前类,其职责更明确
类的隔离 —— 功能的分类
类的隔离,相比于通用的函数,其逻辑更加清晰,便于维护
且更易扩展 —> 因为类有清晰的界定 (你可以将类看成功能的分类
)
即便是工具函数,也可以定义一个工具类
类的自动提示
当在对象后面添加 “.” 之后,IDEA 或其他编译器会给出提示,而函数做不到这点
普通类与抽象类被继承的对比
抽象类一般是通过重构
得来,是一种“自底而上”的设计
二者的区别主要在于:子类的重写,是否具有确定性
- 普通类可将逻辑提取为一个函数,然后返回 null,之后子类可重写该函数的逻辑;但问题是,你无法保证子类是否会真的重写
- 抽象类中子类的重写,暗含确定性,继承的子类一定要重写所定义的抽象方法
抽象类的本质就是提取不变的公共逻辑,将可变的抽象出来,定义为抽象方法,留给子类实现(并且子类一定要实现)
面向对象设计的优点
通过对象,使得能够能加关注业务功能
抽象获得的对象有助于隐藏复杂度,这在一定程度上简化了理解虚拟世界
的难度
如果在现实中找不到对象的影子,仍可以利用对象的行为
类之间的隔离,维护了一种边界,构造出了软件中的“形”
通过抽象
,构建对象
,但如果抽象出的概念
并不清晰,并不会获得比面向过程
更好的结果