什么是面向对象呢?


对于接触或者熟悉一些编程知识的同学来讲,“面向对象”这个词儿一点儿也不陌生。经常听说XX语言是完全面向对象的编程语言,比如C#、Java这些便是完全面向对象的编程语言,又比如C++既是面向过程的编程语言,也是面向对象的编程语言。那么到底二者有什么区别呢,哪个会更好呢?接下来,我结合一个简单的例子来试着阐释我个人的理解。

首先,面向过程与面向对象的概念是解决问题的两种不同思路,一般来讲,面向过程的解决问题思路,比较容易理解,它的理念便是,遇到了一个问题,那么我们要去解决它,我首先做什么,再做什么,接着做什么,最后做什么,所有都完成,那么这个问题就解决了。而面向对象的思路则相对抽象得多,它的理念便是万事万物,都是一个个的对象(也可以说是示例),同样,当我们遇到了一个问题,那么我们采用面向对象的思路来解决问题的话,我们就会抽象和归纳出解决这个问题需要的哪几种事-物;这里的事就是物的动作,特点,数据等描述它和它的行为的抽象。再编程领域,这个事-物的结合体便是类的概念。

下面我用2中不同的思路来解决“把大象放进冰箱的问题”。

(一)面向过程:

便是把要解决的这个问题按照逻辑顺序一步步的完成即可,如下图:

(二)面向对象:

提到面向对象,它的重要标志便是,类的概念。

那么,看到这里,不少同学问题来了,一个件简单的问题,明显面向对象的解决问题思路复杂太多,那么为什么还要用这样的思路来解决问题呢?

我来尝试着回答这个问题:

  • 1、从面向对象的概念诞生时间也在面向过程之后,也可能看出来,面向对象是通过面向过程进化和抽象提炼出来的。
  • 2、从上第二图可以看出,在面向对象的解题思路中,最后仍然用的面向过程,一步步处理。所以某种意义上说,面向过程是面向对象的祖先,面向过程是面向对象的基础;
  • 3、我们所在的世界以及宇宙是非常复杂的,你所碰到的问题也是无限的,而且很多类似,很多重复的部分;那么我们能不能把一份重复的事-物归纳在一起,给他画一个蓝图,以后遇到一样的问题,需要出来,我照着不同的蓝图来拼凑解决问题呢?这便是面向对象的一大重要特征——封装;
  • 4、我们进一步还会发现,不同的蓝图之间,不是完全没有关系的,而是相互包含和支撑的;比如,岩土、水和空气的蓝图组成了地球,而地球,月球、太阳和8大行星便组成了太阳系,而太阳不过是银河系无数恒星中的其中一颗;那么地球上的岩土、水和空气的特征是不是便是地球的特其中一部分;太阳是不是与银河系内其他的恒星具有类似的特点,同时,恒星的特征是不是银河系的特征其中一部分;这些个概念便是面向对象的第二大特征——继承;
  • 5、上面的把大象放进冰箱的问题,你看哈,冰箱具有“把东西放进去的”这样一个特质,那么今天能放大象进去,明天我能不能放头牛进去,后天我放一只鸡进去,对吧,至于放什么进去冰箱并不关心,可以说,万物都能放哈。 这便是面向对象的第三大特征——多态;

综上,是不是突然发现,用面向对象的思路来理解这个世界,是不是更贴切。我们是人类,你我只是这个人类中的一个个体,这个个体是按照人类这个蓝图(模板)来创造的。这边是对我们真实世界的最接近的描述。

所以,其实我们认识世界一开始便是面向对象的,我们通过人脑不断地自然的抽象各种模版出来,从而认识了这个纷繁复杂的世界。这让我想起了小学二年级的一遍课文——《小蝌蚪找妈妈》,几十年了,依然在小学的课本上。小蝌蚪是怎么认识世界的,一开始遇到的鲤鱼妈妈告诉它,四条腿的宽嘴巴的便是你的妈妈。 好了,小蝌蚪便在内心归纳总结,谁有四条腿和一个宽嘴巴便是青蛙妈妈。接下来,它依据这个特征错误地误认为乌龟是青蛙妈妈。乌龟高速它,头顶2个大眼睛,绿色的皮肤便是你的妈妈。最后小蝌蚪加上这两个特征,总共4个特征就找到了青蛙妈妈。 这不就是一个面相对象中一个类的定义过程吗?而类便是面向对象的承载和具体体现。

所以说面向对象和面向过程二者缺一不可,而人类在解决探索世界的时候总是需要不断地抽象、归纳、总结,这个也就是“建模”,某种意义上讲,面相对象似乎更能很好地描述咱们这个复杂的世界。

为了更好的理解我们的时间,为了更好的解决复杂的问题,为了真正的学会一门编程语言,我们一定要要好好地,深入的理解面向对象的思想。

面向对象VS面向过程的更多相关文章

  1. 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

    一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...

  2. 面向对象与面向过程 $this的注意事项和魔术方法set和get

    一.面向对象与面向过程的区别: 二者都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象.面向对象更加强调运用人类在日常的思维逻辑 ...

  3. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  4. Java基础知识强化20:面向对象和面向过程的思想对比

    面向对象与面向过程的区别  1. 与面向对象编程思想相比较的,往往是面向过程的编程思想,其实在我来理解,两者并不冲突,原因是面向对象的编程也必须使用面向过程的思维来实现具体的功能,所以我认为,两者的区 ...

  5. python的面向对象和面向过程

    一.面向对象和面向过程的区别: a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object ...

  6. 面向对象和面向过程,python中的类class,python中程序的入口——main方法,

    1.程序入口,让main显现出来: print(__name__)#__name___是模块中的隐藏字段,当前模块运行的函数名 if __name__ == __main__ __main__() # ...

  7. PHP面向对象和面向过程

    编程界不论是PHP.Python都有这么两种编程思想,oop面向对象.pop面向过程,这两种在功能上没有多大区别,但是在代码编写上却有很大区别.今天就记录一下面向对象和面向过程的优点.缺点.定义.实现 ...

  8. Day5-1 面向对象和面向过程

    摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...

  9. python面向对象和面向过程介绍与区别

    一.面向对象和面向过程的区别: a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object ...

  10. Python 面向对象和面向过程对比

    # 大象装冰箱 # 脚本, 此时代码是最简单的. 不需要构思整个程序的概况 print("开门") print("装大象") print("关门&qu ...

随机推荐

  1. C# 程序集、模块和类型概念及关系

    目录 C# 程序集.模块和类型概念及关系 概述 程序集 模块 类型 程序集.模块和类型的关系 总结 引用 C# 程序集.模块和类型概念及关系 概述 在 C# 中,程序集.模块和类型是构成 .NET 应 ...

  2. 全网首一份!你最需要的PPTP MS-CHAP V2 挑战响应编程模拟计算教程!代码基于RFC2759,附全部源码!

    本文基于网络密码课上的实验 本来想水一水就过去,代码就网上找找,不行就GPT写,但是!一份都找不到,找到的代码都是跑不了的,总会是就是乱七八糟.所以准备认真的写一份. 代码编译成功的前提是要预先装好o ...

  3. 二叉树的遍历(BFS、DFS)

    二叉树的遍历(BFS.DFS) 本文分为以下部分: BFS(广度优先搜索) DFS(深度优先搜索) 先序遍历 中序遍历 后序遍历 总结 BFS(广度优先搜索) 广度优先搜索[^1](英语:Breadt ...

  4. Android 12(S) MultiMedia(十四)ESQueue

    之前看到在ATSParser::Pogram::Stream中会创建一个ESQueue,用于存储解析出来的ES data,这个ESQueue到底是用来做什么的呢?这节就来研究研究. 1.构造函数 ES ...

  5. golang开发 gorilla websocket的使用

    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的.也是最简单的socket服务就 ...

  6. git push遇到的问题“Please make sure you have the correct access rights and the repository exists.”

    问题:今天在用idea往github推送代码的时候,出现了下面的报错 原因:是ssh key有问题,连接不上服务器 解决: 1.得重新在git设置一下身份的名字和邮箱 git config --glo ...

  7. Linux设备驱动--阻塞与非阻塞I/O

    注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...

  8. Spring扩展——@Import注解

    引言 在Spring中有许多Enable开头的注解,比如以下常见注解 @EnableTransactionManagement @EanbleAsync @EnableCache @EnableAsp ...

  9. 引入feign注入报错 org.springframework.beans.factory.NoSuchBeanDefinitionException解决

    引入feign注入报错 org.springframework.beans.factory.NoSuchBeanDefinitionException解决 [172.16.22.215] out: C ...

  10. Mysql行转列,列转行 WITH ROLLUP 统计

    Mysql行转列,列转行 WITH ROLLUP 统计 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id INT(11) NOT NUL ...