谈谈你对面向对象的理解
-
面向对象编程,即OOP,是一种编程范式,满足面向对象编程的语言,一般会提供类、封装、继承等语法和概念来辅助我们进行面向对象编程。
-
面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面
-
面向对象的三大特征 继承,封装,多态
一 继承
- 继承概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。
- 目的:实现代码的复用。
- 理解:子类与父类的关系并不是日常生活中的父子关系,子类与父类而是一种特殊化与一般化的关系,是is-a的关系,子类是父类更加详细的分类。如 class dog 继承于 animal,就可以理解为dog is a animal.注意设计继承的时候.
- 结果:继承后子类自动拥有了父类的属性和方法,子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。
二 封装
-
概念:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只 保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。
-
好处:(1)实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信 息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。
三、多态
- 概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
- 理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的, 是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。
-
“面向过程”和“面向对象”的区别
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
- 可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:
- 1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤 2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
- 如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来 解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对 象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用 第三类对象(规则系统)来对棋局进行判定。
对面向对象的理解2
1、什么是面向对象语言
面向对象语言(Object-Oriented Language)是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。
面向对象语言很多,如一直高居世界编程语言排行榜的Java、C#、C++、Object-C、PHP等等。
2、面向对象的理解
相信很多程序猿,特别是新手,都对面向对象都没有去理解过,但都用过而且可能用的还很熟。
最近面试一位刚入行不久的新手,也有半年多的工作经验了,也做过项目,其实也算不上新手,问其面向对象语言的三个基本特征之一,其回答竟然是“开源”,真是让我大吃一惊。
或许懒、或许感觉这些抽象的文字难以学习理解、或许认为工作中用不到,但我想这些最基本知识的还是要知道的,不要工作3年,积累下的经验可能3天都不到。
以下是个人对面向对象的理解:
什么是对象? 引用我的一位大学老师的说:一切都是类、一切都是对象。
现在大部分的面向对象语言是基于类的。
他的算是启蒙老师吧,很风趣的一位老师,在学校代课教我们时,最经常挂在嘴边的就是这句话(只要他的课这句话最少要听到10次以上)。以至于现在想到他,脑海里第一反应就是这句话。
除了红字以上是我的废话,可以忽略。
2.1、对象
一切都是对象
举例:
将一栋房子 比作一个对象 【房子:对象】。 从图上也可以看到这是一种新类别的房子【房子:类-Class】 如图
这尼玛就是对象,那对象应该包含什么呢,相信只要学过,面向对象的肯定都知道面向对象的三项基本特征:封装、继承、多态。
2.2、对象的基本特征一:封装
封装 将各个独立功能设计成一个个独立的单元,形成一个有规划设计的整体,减小耦合,提高内聚,避免牵一发而动全身,方便对程序的修改。
还是用房子来解释,上面已经有房子的基本类型了,大概样子就是那个熊样。
举例:
房子空间很大,但是如果男男女女有十几人住,而且就一间屋子的话,很不方便,如果吃喝拉撒一个屋,那就成难民营,更何况晚上灯一黑,立刻就乱套了,你懂得。
这样,就要想法解决:
工人们出动了,把房子折腾折腾给分成楼上楼下两层,并说明了,一楼吃喝玩乐、二楼休息; 楼上楼下工人们又分别给隔离出几个房间,就把房子这样改造好了,然后男男女女们过来了,大家就可以各自的房间,做爱做的事,而且不会影响到其他了。
这样一个简单的封装就完成 【房子:类-class】是对 【房子两层:部分类-partialclass】的封装 ;【房子两层:部分类-partialclass】是对【房间:函数/方法-function】的封装。
2.3、对象的基本特征二:继承
继承 发生在两个对象之间,继承对象可以肆意的使用被继承对象的一些属性、方法&函数等;使代码重用,减少编码量,间接减少维护成本。
仍然是房子。
工人们已经给分好楼、做好房间了。这时有个人觉得房子应该有个紧急避难所。好吗,尼玛房子都折腾的差不多了,尼玛告诉工人要紧急避难所,工人说这不好搞哇。可以这人有钱,任性,
发话了,要搞必须搞,不好搞也要搞,而且狠狠的搞。工人们就为难了,难道再去给盖一栋有避难所的房子?大家集思广益最终,房子其他都还用着,再给挖个地下室。于是新房子诞生了。
一个简单的继承就出现了 【房子:基类-baseclass】被【新房子:扩展类-ExtensionClass】继承。
2.4、对象的基本特征三:多态
多态 不同的场合做出不同相应,有着不同的特点,可以说是封装的一个实现。
房子已经成型,要对房间进行装修了,工人想法很简单都按照一种样式来,简单方便快捷。但是住房的男男女女们有意见,这就是尼玛客户,各种千奇百怪的想法,有要在承重墙
上开扇窗户的,有要在卫生间装摄像头的、要在厨房里装空调。工人们对能实现就开始开工了,对房子的窗户、地板、墙、楼梯等进行装修。这样装修完房子内部就丰富起来了。如图
“一种多态的展现”就出来了:【房子:类-class】 通过 【窗户、地板、墙、楼梯等:属性-Property】体现多态
2.5、面向对象
最后的总结,前面其实是对象的说明。现在来说一下面向对象,像开篇提到的一切都是对象。那面向对象有是怎么回事呢难道说是面向一切,真这么理解也不为过。
面向对象是一种对现实世界理解和抽象的方法,对做程序来说,就是让程序人员,用一种思维更好的看待万物,在编程中的本质。