本文已参与「新人创作礼」活动,一起开启掘金创作之路。
声明:版权归本人所有,违者必究。
转载请注明来源 https://juejin.cn/post/7112658873902694413
1.1. 认识面向对象
在计算机发展初期,计算机主要用于满足某种计算的场景,即指定输入条件,让计算机输出期望的结果,于是函数出现了;随着高级编程语言的产生,人们可以利用计算机做更复杂的事,通过编程语言将要解决的问题拆解成多个步骤,让计算机按流程依次处理每个步骤,于是产生了面向过程的编程思想;继续随着计算机技术的发展,人们通过编程语言来实现更复杂的功能,结构体中出现多个变量和函数,通过对这些方法和函数的分类,产生了各种各样的类,于是产生了面向对象的编程思想。
1.1.1. 什么是面向对象
面向对象编程(Object Oriented Programming,OOP),是一种程序设计思想,其基本思想是一切皆对象。对象泛指现实中一切事物,每种事物都具备自己的属性和行为,对象与对象之间通过紧密协作完成指定任务。以汽车为例,车轮、发动机、方向盘等都可看做对象,车轮有品牌、型号、大小等属性,车轮有前进、后退、转弯等行为,司机通过给发动机下发命令来控制汽车的前进与后退,以完成到达目的地的任务。面向对象是把构成问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的具备的行为能力。
1.1.2. 面向过程与面向对象
与面向对象编程对应的是面向过程编程。面向过程就是将要解决的问题分解成若干个步骤(函数),为每个步骤指定条件(输入)和预期结果(输出),通过代码将这些步骤组合在一起,依次执行以完成最终任务。它更关注的是处理问题的步骤,而面向对象更关注的是参与解决问题的角色定义。
以洗衣服为例,按面向过程的思想:
第一步:打开水龙头,往洗衣机里放水
第二步:往洗衣机里放入衣服
第三步:往洗衣机里加入洗衣粉
第四步:启动洗涤按钮,开始洗衣服
第五步:等待洗衣结束
第六步:洗涤完成,将衣服甩干
第七步:晾晒衣服,完成
以面向对象的思想类设计洗衣服这件事情:
第一步:分析参与洗衣服的对象,人 、洗衣机、洗衣粉、水。
第二步:分析每个对象具有的属性和行为。人有姓名、年龄、性别等属性,有操作洗衣机、操作水龙头、晾晒衣服等行为;洗衣机有品牌、尺寸、颜色等属性,有洗涤、脱水、烘干等功能;洗衣服有形状、颜色、气味等属性,有去污、溶水等能力。
第三步:设置对象之间的关联,对象间通信。人点击洗衣机的洗涤功能,通知洗衣机执行洗涤行为;洗涤结束后,洗衣机会发出提示音,提示人洗涤已完成。
由此可以看出,面向过程与面向对象,是两种分析问题、解决问题的方式方法。面向过程重点在于将问题分解成多个可执行的步骤,每个步骤知道要做什么,每个步骤有明确的目的,执行时按照顺序自上而下依次执行。面向对象注重的是对解决问题的参与者进行归纳、分类,明确其职责,通过参与者之间的关联建立程序的逻辑。
正因这种解决问题思想的区别,其优缺点也各不相同。面向过程因没有各种类之间的相互调用,也不需要类的实例化,性能方面会略显优势,但随着代码量的增大,后期的可维护性、可扩展性、复用性等方面会相对较弱;面向对象通过对类的抽象、封装、继承等,在可维护性、可扩展性、复用性等方面更容易,可以是系统更灵活,但类的实例化、类之间调用等行为会在性能方面有一定影响。
1.1.3. 面向对象的常见概念
抽象: 抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。如猫、狗、鸭子、鸟的共同特性是动物,得出“动物”这一概念的过程称为抽象化。
类: 类是对现实世界中具有相同特征和行为的一类事物的抽象,没有具体的指向,如:人、房子、汽车、学校、手机、动物等。类是对象的抽象。
对象: 对象是在现实世界中真实存在的事物,万物皆对象,它是具体的、客观存在的、唯一的,如:你的同学张三、你的房子、清华大学、手里正拿着的手机等。对象是类的实例。
实例化: 用类创建对象的过程叫实例化。
属性: 类的特征,如人的姓名、民族、宗教、身份证号。
方法: 类的行为,如人走路、吃饭、睡觉、洗衣服、打游戏。
1.1.4. 面向对象的特性
面向对象主要有三个特征:封装、继承、多态。
1、封装****
封装是面向对象编程的核心思想,封装就是将数据和对数据的操作放在一起。封装的前提是对具体事物的抽象,将其共同属性和行为提取出来,通过一个“类”来表示这一类事物,而具体的事物又是“类”的实例。封装的目的是为了对外屏蔽对象内部状态和行为的实现细节,对外仅暴露必须的接口与其他对象通信。
现实生活中,我们可以看到很多封装的例子。加油站的机器将内部所有状态和行为屏蔽,仅通过一个操作面板和油枪与“人”和“车”进行交互,工作人员不需要知道油是怎样出来的,只管操作面板对机器下命令即可;我们使用的笔记本也可看做封装的例子,USB、电源、键盘、屏幕等为对外部暴露出来的接口,而内部的主板、磁盘等封装起来,我们只需要插上电源线、打开屏幕、按键盘等与笔记本进行交互,不需要关注其内部的实现细节。
2、继承****
继承是面向对象编程的基石,它允许创建具有等级层级的类,继承就是子类继承父类的特征和行为。继承的目的是为了使子类具有和父类相同的特征和行为,减少重复的代码。
动物是一个类,具有生命、年龄等特征,具有呼吸、吃食物、睡觉等行为;狗是一个类,它具有和动物一样的特征和行为,因此,狗是动物的子类,动物是狗的父类;猫也是一个类,它也具有和动物一样的特征和行为,猫也是动物的子类,动物是猫的父类。因此可以说,狗和猫,都是继承自动物这个类。
3、多态****
多态是面向对象编程的魔法棒,它使得同一个行为具有不同的表现形式。猫和狗都继承自动物,都有“叫”的方法,但猫的叫声和都的叫声却大不相同;打印机既可以打印黑白照片,又可以打印彩色照片,都是“打印”方法,却有两种不同的结果。