问题描述
- 通俗解释:什么是面向对象?与面向过程区别在哪?
-
什么是面向对象?与面向过程区别在哪?用通俗的话语解答,不要理论性的专业术语,最好是拿生活中的熟知的事物去类比解释!!!多谢~
解决方案
面向对象和面向过程不矛盾,事实上,Java也是面向过程的编程语言。
面向过程是指,允许在程序中定义函数或者方法。也许你觉得奇怪,难道还有语言不能定义函数方法么?早期的basic就不可以,只能用跳转来实现函数调用。
面向对象更近一步,允许你将“过程”(函数、方法)以及它们的上下文相关的数据封装成对象,同时对象允许通过继承和派生以及类型限定符限制开发者对它的一部分的进行访问和修改。
我不想把面向对象和生活中的事物去联系,固然它们有些似是而非的联系,但是这对于你理解编程的本质毫无意义,甚至会误导你。面向对象的本质不是模拟现实世界的对象,而是为了开发强壮、简单和可维护的代码。
解决方案二:
将面向对象说的通俗易懂的坏处就是看上去是通俗易懂了,其实你懂的根本就是错的东西,而且这使得新手完全误入歧途。
面向对象的三大特性(封装、继承、多态),核心一条是封装,不允许你访问私有的函数和成员这个相信很多人都理解,其实还有一层,就是不允许开发者随便修改代码,因为随意修改代码和随意修改变量的值一样是灾祸之源。
在面向过程中,如果你发现程序不合适了,需要增加功能,你会怎么做?你会直接去修改某个函数的代码,但是如果这个函数不是你写的,你不完全理解,这么做会可能出问题。另一个问题是,你不知道现有的代码是怎么调用这个函数的。换一句话说,你修改了它,你这里是满意了,别的地方的调用呢?会不会有问题?
那么怎么办?你想,这不简单,我把这个函数拷贝一份,在拷贝上修改,不动原来的函数。这样问题又来了。如果原来函数的编写者发现了一个bug,他修复了,可是你拷贝的那份的bug不会自己修复,除非修改的时候要知道这代码都被拷贝了几份,一一修改。
面向对象是怎么解决这个问题的呢?开发者通过编写一个类,实现一个功能,这个类中一些方法被定义为虚拟方法。
当你需要修改这个方法适应新的需求的时候,你不是直接去修改这个类的源代码,而是派生一个类,去重写这些允许你自定义的虚拟方法,这样你就在可控的范围内自定义了原来的程序。
但是因为别的地方调用的是基类的类型,而你并没有修改基类的代码,所以不会造成原先的代码出问题。而且,基类的原作者如果发现一个非虚拟的方法有bug,他直接修改就好了。
因为你的类是继承的这些代码,而不是拷贝粘贴的,所以修改一处,就全部变过来了。
解决方案三:
至于“多态”,很多人,特别是培训班和大学里面的老师,误人子弟地将它和派生类重写方法划等号。其实多态的意思是,一个概念多种表现形式。
对于Java,函数重载、派生类型和重写、泛型都是多态的体现。多态有什么用?显而易见,简化了程序调用者学习的负担。因为掌握一个概念,他可以调用的是一系列的代码。
他知道一个函数名,那么他可以调用不同的函数重载版本。List<String>
和List<int>
虽然是两个类型,但是相信没有人会了前者,后者还不会的。
解决方案四:
面向对象,也就是相当于抽象建模,然后将一个个的事物封装成一个共性体,然后直接使用共性体的方法过程。面向过程就是指完成功能,以功能为主线,不进行抽象,一个功能一个过程。面向对象相对来说,层次明显,架构分明,理解起来比较容易,一般面向对象中肯定会包含面向过程的。以上是个人理解。。。
解决方案六:
人.吃饭(),这是面向对象
张嘴->往嘴里放东西->咀嚼->吞下去,这是面向过程
第一种注重的是“人”这个对象,第二种注重的是”吃“这个过程。
但实际上"人.吃饭()"这个方法底层也是靠“吃”这个过程实现的。
解决方案七:
面向对象是将现实中的事物对象化,比如人是一个对象,狗是一个对象,假如人牵着狗散步是一段程序,那么执行人牵着狗的内部却是顺序执行。顺序执行通俗的说就是面向过程,其实面向对象之中是包含面向过程的思想。但是假如是面向过程来实现人牵着狗散步。就必须先先创建人和狗。但是创建人和狗会顺序创建,并不会提取他们的特性对象化。所以说他的重用性很低。如果我在执行一段人牵着狗,假如这只狗不是上面那个狗,比如,上面是贵宾犬,这个是阿拉加斯。那么因为我不是面向对象编程,并没有提取狗的特性,那么在执行这个人牵着狗,就得重新在这一遍然后顺序执行。
解决方案八:
面向对象是对事物的抽象
你可以说苹果是水果,但是你不能说水果是苹果,这里水果就是抽象的,苹果就是具体的,抽象--具体,就是面向对象。
面向过程就是把一系列的操作写出来,程序是按照你写的过程执行的
解决方案九:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
解决方案十:
给你说简单点,面向过程:我要坐车回家,那么我就需要站路边,伸手招车,上车,到家后下车,付钱,等等的这些操作都是坐车回家的过程、步骤。这个就是面向过程。而面向对象就像游戏里的回程卷轴,按一下就使用,然后直接到家了,这个卷轴就是将前面打车回家的过程的封装