广州番禺Python, Java小班周末班培训
第四期线下Java, Python小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析, Java中高级工程师培训。授课详情请点击:http://chipscoco.com/?cate=6
7.2.1 理解面向对象
在7.1节中讲到了面向过程,面向过程是把问题的求解过程分解为多个步骤,而面向对象关注的是问题本身,将其视为一个整体,并抽象为一种数据类型。在面向对象的程序设计中,通过定义类类型来进行抽象。
抽象是概括和归类的意思,抽象一种数据类型说的是将一类事物的共性概括起来。
理解面向对象,需要思考两个核心问题:什么是对象?什么是面向对象?
(1) 什么是对象?
Java中的对象是指类的一个具体实例,而类代表的是一类具有相同属性和行为的事物。举个简单的例子,我们可以定义一个叫做Dog的类,Dog代表着狗这种动物的共性。而一条具体的狗就是对象,比如你在街上看到的一条流浪狗,这条流浪狗就是狗的具体实例,它一定具备狗这种动物的共性,否则它就不是狗。
在Java中通过class关键字来定义类,在7.3节中会进行详细讲解。
(2) 什么是面向对象?
面向是一个动词,面向对象是指对某一类事物进行描述,概括,然后以计算机中的编程语言进行建模,将生活中的一切事物对象化。 面向对象编程的核心是抽象,那么什么是抽象呢?简单地解释,抽象就是概括和归类,这里的概括是对共性的概括。
薯条老师家里养了一只短尾猫,那么,就以猫来对面向对象进行举例。倘以对象的角度来看世界,那么一切皆对象。自然,这只猫也是对象,那么在面向对象的程序设计过程中,我们可以使用Java语言来对猫进行对象化:自定义一个Cat类对猫进行抽象,并定义Cat类型的属性和操作方法。
进一步理解面向对象,同学们需理解面向对象的三个核心特征:封装,继承,多态。
7.2.2 面向对象的三大特征
(1) 什么是封装?
封装说的通俗一点,就是藏起来。面向对象中的封装,是指将数据类型的属性和方法的实现细节藏起来,只需提供对数据类型进行操作的接口。对于封装和接口,下图的插座和电源线的关系就很形象:
插座对外隐藏了其内部的实现细节,对外提供了供电源线进行电路连接的接口。 封装的实质是将数据类型与数据类型的使用者进行隔离。将内部属性进行隔离,保障了数据的完整性。将数据类型操作方法的实现细节进行隔离,隔离了实现过程的复杂度。封装的另外一个重要性是便于代码的复用,比如将需要重复执行的代码块封装为一个函数。
(2) 继承
“子承父业”就包含继承的概念。小王对父亲老王进行继承以后,就可以获得老王的财产。面向对象中的继承也是一样的道理,比如A类型继承于B类型,那么A类型就获得了B类型的属性和方法。A类就叫做B类的子类,B类就是A类的父类。
从这一点也可以看出,计算机中的复杂概念是对生活经验的提炼和模拟。我们在理解复杂的概念时,可以多进行发散思考,联想生活中出现的事物。
在面向对象设计中,可以通过继承来实现复用和扩展。只是继承,而不进行扩展,那么这样的设计多半是糟糕和无用的设计。如同小王继承了老王的财产,如果只是用来进行挥霍,而不思进取,那么小王一定会坐吃山空,沦为一个败家子。
(3) 多态
多态是指同一事物存在多种状态或行为。在面向对象程序设计中,多态一般是指父类方法的多种不同实现方式。如何对父类方法进行多种不同的实现?可以通过继承的方式,即多个子类对从父类继承的方法进行不同的实现。
子类对父类方法进行不同的实现以后,将子类再赋值给父类对象,父类对象再根据子类对象的类型,在运行时调用同一方法的不同实现,这样就实现了多态。
初学者在理解封装,继承,多态时,会觉得很抽象,这是很正常的。在后面的教程中,会以代码示例来帮助同学们理解何为面向对象中的封装,继承,多态。在本节内容中,只需对面向对象的三大特征建立初步的认识,做到“差不多理解”即可。
7.2.3 面向对象之SOLID
SOLID是面向对象设计五大基本原则的首字母缩写, 在开发面向对象的应用程序时,遵循SOLID原则可以让代码更加健壮和易于扩展。下表所示为SOLID对应的五大基本原则:
设计模式原则 | 描述 |
单一职责原则 | 一个类或一个接口应该保持功能单一,仅有一个引起它变化的原因 |
开闭原则 | 简言之即对修改关闭,对扩展开放 |
里氏替换原则 | 任何使用基类的地方 ,也可以用其子类来替换,不会影响程序的执行结果 |
接口隔离原则 | 客户端不应依赖它不需要的接口;一个类对另一个类的依赖只需建立在最小的接口上 |
依赖反转原则 | 高层模块不应依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 依赖反转原则的核心是面向接口编程 |
读者在学习面向对象的程序设计时,无需死记硬背这几个设计原则。好的学习方法是先记住大体轮廓,理解其基本概念,然后再结合代码实例来深入理解,逐个突破。在后面的教程中,笔者会结合实例来对设计模式的SOLID进行讲解。
7.2.4 课后习题
(1) 谈谈你对面向对象的理解
(2) 面向过程与面向对象的区别是什么?
(3) 什么是对象?何为封装?何为继承?何为多态?
(4) 如何理解“只是继承,而不进行扩展”是糟糕和无用的设计?