相比于面向过程,面向对象可以更好的抽象
现实中的实体,抽象为概念,并且,将其应用于程序,使得所编写的代码可读性大大提高
为什么这样说呢? -------->>> 抽象的意义
对概念的清晰定义,能够更好的理解概念所具备的共有属性,并与原有知识进行关联(知识之间往往具有很强的关联性)
如果感觉自己的思路混乱,往往是因为对概念的理解只有一种大概的模糊性,尝试去提出问题,通过问题,将概念理清晰
对面向对象的理解有何好处?
看源码的时候,可以站在一种全局的视角,不仅可以知道技术的实现,还可以意识到该技术为什么这样实现
新技术的诞生与流行,往往在于替代或弥补原有技术的不足
面向对象相对于面向过程有什么好处?或者说,面向对象,弥补了面向过程的哪些不足?
先来理解下抽象,抽象可分为 adj、n、v
abstract:
general ideas and not on any particular real person, thing or situationthought or as an idea but not having a physical realitymain ideas in a documentthought: 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
similar characteristics or qualities类可以理解为分类,在面向对象中,具有相同属性的概念,可以提取到一个类中,这是函数所不具备的
类中有字段和方法
类中的方法,类比于函数:输入的参数 —> 执行相应的逻辑操作 —> 返回结果(不同参数 --> 不同结果)
对象的引入,使得可以在软件中模拟显示世界;针对问题进行编程
函数的生命周期为:在函数执行完成之后,将会从栈中弹出
类具备函数中所没有的字段,使用类实例化之后的对象,会保留在堆中,而不是从栈中弹出
类中字段的存在,带给了类哪些功能,而这些功能是函数所不具备的?
对象能够得到保留,那么,可以利用字段,去⭐保存一些数据或状态值💾
字段可实现与函数中的参数相同的功能,于是,假设你将字段看成参数,那么,也就是说,一个类中,封装了参数和行为
那这样有什么好处呢?⭐实现了参数的复用,类似于全局变量的效果,但是通常来说,字段服务于当前类,其职责更明确
类的隔离,相比于通用的函数,其逻辑更加清晰,便于维护
且更易扩展 —> 因为类有清晰的界定 (你可以将类看成功能的分类)
即便是工具函数,也可以定义一个工具类
当在对象后面添加 “.” 之后,IDEA 或其他编译器会给出提示,而函数做不到这点
抽象类一般是通过重构得来,是一种“自底而上”的设计
二者的区别主要在于:子类的重写,是否具有确定性
抽象类的本质就是提取不变的公共逻辑,将可变的抽象出来,定义为抽象方法,留给子类实现(并且子类一定要实现)
通过对象,使得能够能加关注业务功能
抽象获得的对象有助于隐藏复杂度,这在一定程度上简化了理解虚拟世界的难度
如果在现实中找不到对象的影子,仍可以利用对象的行为
类之间的隔离,维护了一种边界,构造出了软件中的“形”
通过抽象,构建对象,但如果抽象出的概念并不清晰,并不会获得比面向过程更好的结果