当前位置:首页 > 产品运营 > 正文

面向对象,面向对象思想是什么?

这是一个非常好的问题,建立面向对象编程思想是学习面向对象编程的关键,下面就把面向对象思想做一个总结。

什么是面向对象思想呢?简单的说就是考虑问题以对象为出发点而不是以流程为出发点,通过对象之间的交互完成一系列功能的实现,这就是面向对象思想。

对象又是什么呢?简单的说就是一切都是对象,对象能够涵盖所有我们已经认知的事物和未认知的事物,只要是存在的东西都可以认为是对象,比如“黑洞”、“暗物质”等等,所以对象的范围非常广泛。

面向对象思想如何落地呢?面向对象编程思想包括四个概念、三个特征、一个过程,下面分别解释一下(以Java语言为例):

四个概念分别是类、对象、属性和方法,其中类表示定义,对象表示类的实例,属性表示对象的状态,方法表示对象的功能。举个例子,比如我们要通过面向对象的思维方式来描述学生,那么就需要为学生构建一个类:

面向对象,面向对象思想是什么? 第1张 面向对象,面向对象思想是什么? 产品运营

类中定义了学生的学号和姓名,同时定义了一个打印学生信息的方法,这就是类,但是类只是一个定义,要想完成具体的应用,需要通过类来创建出一个实例,这个实例就是对象,看一个例子:

面向对象,面向对象思想是什么? 第2张 面向对象,面向对象思想是什么? 产品运营

例子中通过构造方法创建初始化了一个实例,这个时候,这个实例就是一个实实在在存在的对象了,此时这个对象就可以调用方法来实现功能了。

通过这个例子,我们可以了解类、对象、属性、方法之间的关系,同时也阐述了面向对象的编程过程,这个过程分为三个步骤,分别是类的定义、对象的创建、方法的调用。

三个特征分别是封装、继承和多态,其中封装提高类的内聚性,封装包括三个步骤,分别是私有化成员属性、定义设置器、定义获取器,看一个例子:

面向对象,面向对象思想是什么? 第3张 面向对象,面向对象思想是什么? 产品运营

继承是在一个类的基础之上再派生出一个新类的过程,通过继承,子类能够完成对父类方法的继承,看一个例子:

面向对象,面向对象思想是什么? 第4张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象思想是什么? 第5张 面向对象,面向对象思想是什么? 产品运营

继承体现的是一种发展的概念,是面向对象编程过程中的一个重要概念。

多态的理解是一个稍微麻烦的事情,但是简单的总结一下,多态可以用两个方法和三个定义来描述多态。两个方法分别是方法重载和方法重写,三个定义分别是父类定义子类构建、抽象类定义实体类构建、接口定义实体类构建。

先看一下方法重载,方法重载简单的说就是同一个类中定义了多个方法,具有相同的名字,不同的参数列表,看一个例子:

面向对象,面向对象思想是什么? 第6张 面向对象,面向对象思想是什么? 产品运营

方法重写简单的说就是一个前提、三个相同、两个规定,一个前提是在继承体系结构下,子类定义了某个方法与父类的方法具有相同的名字、参数列表、返回值类型,两个规定分别是子类方法的范围限定不能小于父类方法,子类方法不能抛出更多的异常,看一个例子:

面向对象,面向对象思想是什么? 第7张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象思想是什么? 第8张 面向对象,面向对象思想是什么? 产品运营

下面再看一下三个定义,三个定义是理解多态的重点,也是一个小难点。第一个定义是父类定义子类构建,看一个例子:

面向对象,面向对象思想是什么? 第9张 面向对象,面向对象思想是什么? 产品运营

第二个定义是接口定义实体类构建,看一个例子:

面向对象,面向对象思想是什么? 第10张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象思想是什么? 第11张 面向对象,面向对象思想是什么? 产品运营

第三个定义是抽象类定义实体类构建,看一个例子:

面向对象,面向对象思想是什么? 第12张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象思想是什么? 第13张 面向对象,面向对象思想是什么? 产品运营

以上内容就是对面向对象编程思想的一个简单描述,面向对象思想现在已经有了很大的扩展,Spring就是面向对象编程和面向方面编程结合的例子,Spring目前在Java开发领域也有广泛的应用。

我做软件开发工作多年,目前的研究方向是大数据和人工智能,也在带大数据方向的研究生,我会陆续在头条写一些关于软件开发方面的文章,感兴趣的朋友可以关注我的头条号,相信一定会有所收获。

如果有软件开发方面的问题,也可以咨询我。

谢谢!

面向对象,在编程语言中,面向过程与面向对象的区别在哪?优缺点在哪?

作为一个老码农,不请自来,用一句话表明二者的区别,面相过程是变量与方法的分离,面相对象是变量与方法的结合。例如,一个厨师炒菜,油盐酱醋,时间,食材,火候之类的都是变量,煎炸炒蒸之类的烹饪都是方法。那我们分别用二者来描述厨师做到的过程。首先是面相过程,它十分详细地描述一个厨师怎样食材变成菜的过程,比如先切菜,这样调用了切菜函数,有参数切菜数量,切菜大小,形状等,然后煎,又有各种参数,比如时间,火候,以后炸,放调料,一个完整的做菜过程,十分符合思维逻辑,但是问题了来了,每道菜的过程都不一样,那么每道菜都对应了这样的过程,每个厨师的手法和爱好不一样,那么每个厨师每道菜都有这样一个过程,瞬间多了好多代码是不是,然后可能顾客口味不一样,菜品风格变了,比如有些人不吃油炸的,那么每道菜的过程又要改变了,一旦厨师多了,菜的种类多了,顾客要求多了,写代码就变成了一件非常麻烦的事情,这个时候,出现了面相对象。我们不妨这么想,我们把每个厨师看成一个独立的对象,那么我们把这个厨师数字化,用一堆数据,也就是变量是描述他,身高,体重,年龄等等,把油盐酱醋之类的变量也和这个人绑定。然后我们把厨师做的事情都写成方法,吃饭睡觉,包括他做饭的方法,这样一来方法也和这人绑定了,所以此时我们做到了变量与方法的结合。我们知道,每个厨师都可以用类似方法描述,这样一来我们可以把厨师这一类人都用相同的变量和方法进行描述,这些被我们抽象出来的变量与方法的集合就叫做一个类,当我们初始化一个类之后,比如,定义了身高体重,兴趣爱好,油盐酱醋用量,加上一堆生活和做饭的方法,这个过程就叫做实例化。实例化一个厨师类之后我们就拥有了一个厨师实例,然后就可以开始调用这个厨师的方法了,比如青椒肉丝,切菜,炒菜,放调料,出锅,都只需要调用类中的方法,只是根据菜品不同调用的方法和参数不一样,而且菜谱变了我换一下方法就行,拿到任何地方都可以用,而且可以随时实例化一个新厨师应对不同的顾客。现在我总结一下,面相对象只是一个将变量和方法抽象到一起,形成统一描述的类的方法,具体过程还是面相过程的,不过它可以提高代码的可重用性,例如,中餐菜谱换到西方就不行了,就要都改进,也就是改代码,很麻烦,但是面相对象很简单,换个厨师就行,也就是怎么还的问题你都不需要考虑,设计这个类的人都帮你想好了,这就是面相对象的一大特征,封装。然后这个厨师退休了,年轻厨师学会他的所有技术,还自创了很多技术,这样一来,不需要年轻厨师重新研究之前的做菜技术,直接拿老厨师的来用就可以了,这叫做继承,也是面向对象三大特征之一。最后,对同一道菜,有不同的做法,年轻厨师虽然继承了老厨师,但是某些菜他有自己的做法,于是他看客人的喜好,客人喜欢哪种他用哪种,这叫多态,也是面向对象三大特征之一。

好了,作为一个老码农加吃货,用做菜类比,打架了看明白了吗。

面向对象,面向对象(OOP)是编程语言发展中的弯路吗?为什么?

一切皆对象的口号显然有点过了,但也不至于说走了多少弯路。这个问题跟「子类型(subtyping)是不是错误(ill-defined)的东西?」有点类似,就是程序员突然发现工具箱里面有些工具没了的话好像也没关系,就开始怀疑它们是不是多余的或错误的设计。OOP是个模糊的概念,它不仅仅指程序语言的那些特性,OOP之前必须先OOD (Object Oriented Design),不可能脱离OOD谈OOP,如果只谈概念,我们来看看:封装:到底什么是封装?私有方法?那 Haskell 只导出 Smart Constructors 算不算?继承:OCaml module include 算不算?Typeclass hierarchy 算不算?多态:参数化多态也叫多态啊!如何才能划出一条清晰的边线界定OOP?对象内部状态?这可就麻烦大了,所有非纯函数式编程都不可能完全避开内部状态。如果你就是要原教旨 Pure FP 大法好?那……你开心就好:type MonadStackHell a b c = AppT (MaybeT (ReaderT a (StateT b IO))) c不要跟我提Extensible effects,既然Haskell都只能做到这种地步,为什么它就不算走弯路?有些人不爽的地方可能在于,数据和行为是两个不同的维度,而现有的OOP语言都把数据和行为绑定到了一起,不得不用 Extensible Visitor Pattern 绕弯。可这本身就是难解之题,Haskell 里面虽然可以很方便地用 Typeclass 扩展方法,但添加新的数据却成了问题。Data types à la carte 那种方式虽然可以无限扩展数据,但却增加了转型的运行时开销,鱼和熊掌不可兼得,OOP 语言选择了另一条路,但子类型虚函数又会增加方法调用的运行时开销。(我也不提 Object Algebras 只从编程语言角度思考就进入了死胡同,我们要从OOD的角度看。在设计时自然说 A student is a Person,继承了Person的属性和方法,Haskell不支持Record继承,难道在设计时也说Student包含一个Person?然后白板上 Functor、MonadTrans、Constraints 满天飞?这样看将 Subtying 和 Inheritance 捆绑在一起还真是非常贴心,要是只说Student是Person的子类还不够,还要加一句Person有的ABCD接口Student都继承实现,那就太啰嗦了 。对象思维方式显然更易于描述现实中的大部分业务模型。它有它的局限性,但离泛滥还远着呢,我看到更多的是很多程序员根本不懂面向对象设计,甚至根本就没有 Design 这一步,从这方面来讲,不但不算是弯路,甚至还应该继续大力推进。问题的关键并不在于OOP,而在于错误的OOD。如果OOD本身就是错的,那么正确的又是什么?我觉得现在我们还不能完美回答这个问题,有一个词呼之欲出: Language Oriented Design,但是我们还有很多路要走,而且我很怀疑有些业务逻辑天生更适合用OOD描述,换成LOD只不过是重新发明一个OO DSL而已。

面向对象,面向对象思想是什么? 第14张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象思想是什么? 第15张 面向对象,面向对象思想是什么? 产品运营

面向对象,面向对象和面向过程最本质的区别是什么?

这是技术面试过程中经常问的问题,真要彻底的讲明白,不是一件很容易的事情。可以简单的用C语言和C++两种语言的本质区别来具体解释,首先从设计模式来讲面向对象更加容易形成框架特性,现在高级语言基本上都支持面向对象,像java,python都是这个样子。

从事编程十几年两种思想的编程语言都有一些涉猎,整体给人感觉面相对对象更加容易理解,面向对象更加抽象,现在就一些具体的特性做一个大概的了解。

面向对象,面向对象思想是什么? 第16张 面向对象,面向对象思想是什么? 产品运营

如何理解面向过程面向过程和大家正常是思维模式接近,把一个问题按照从左到右,从上到下的解决方案分解成N个小步骤然后挨个去执行,说的再抽象一点就是模块化,具体实现通过函数来完成,函数里面又可以调用函数,最终功能点就是被无数个函数来完成。

从代码逻辑上分析,主函数main函数下面分成几个大的功能函数,这几个函数又被分解成无数个小函数完成,稍微复杂点开启多个线程异步处理一些功能,基本上就是面向过程的全过程了,非常容易理解,底层的功能模块也能别的功能模块共用,不能讲面向过程没有共用性,只不过相对框架性看起来差些,linux内核绝大部分代码都是C语言完成,如果没有框架性不可能这么稳定的运行,也正是这么灵活的功能模块调用,早就了高效,所以在某些领域C语言依然是编程首先,同时也是基石,现在很多编程语言的底层都是C语言来完成的。

面向对象,面向对象思想是什么? 第17张 面向对象,面向对象思想是什么? 产品运营

如果能用C语言的框架把一个系统构建的十分完善并且具备很强的扩展性,一定是编程的高手,这主要靠内在功底把零散的东西有机的结合成一种框架,不像面向对象自带抽象模型体系。

如何理解面向对象面向对象在模式上和面向过程截然不同,面向对象是先抽象一个模型,然后把这个模型实例化来使用,这个抽象模型就是大家经常听到的类的概念,类并不能直接去使用,而是需要直接实例化,所以做了很多年面向过程的老程序员,发现面向对象类必须实例化,特别是想调用里面其中的一个方法的时候,还需要拿到对方的实例,然后才能直接去调用,放在面向过程的编程里面是可以直接功能函数。

面向对象,面向对象思想是什么? 第18张 面向对象,面向对象思想是什么? 产品运营

面向对象里面的类,其实是面向对象里面结构体的延伸,把这个概念放大化了。类主要是两个部分构成,属性和方法,属性就是变量,方法就是功能模块。当然面向对象最主要的概念是把事物抽象化,举个例子,把各种动物抽象成一个类,常见的狗,鸡鸭鹅等共有的属性,都有能走动的动作,都有脚属性,但不同的动物数量不一样,抽象成一个动物类,如果要弄一个狗的类首先继承一个动物类,并且把动物基本的特性继承过来,如果觉得有些方法差异太大就覆盖掉,同时增加新的特性封装成一个新的类,然后实例化进行具体使用,还可以同时继承多个类,拿到共性的方法或者属性,这样子能很好的继承已经有的功能,特别积累并且继承以前的功能。

面向对象,面向对象思想是什么? 第19张 面向对象,面向对象思想是什么? 产品运营

面向对象在代码量上会比面向过程的会少一些,毕竟有些功能方法可以直接继承过来用,所以开发面向对象的程序员切换到面向过程会觉得特别不舒服,有些共有的方法直接继承过来去用非常顺其自然,面向过程调用更加突兀或者直接一点。面向对象在解决复杂是逻辑上更加占据一定的优势,而且越用越有感觉。

如何理解面向对象的三个特性?

面向对象,面向对象思想是什么? 第20张 面向对象,面向对象思想是什么? 产品运营

1.封装性

就是把属性和方法都放在一个类里面,而且还可以通过访问类的权限属性给区分开,更加安全,不想要释放的功能,直接搞成私有机制,正好符合软件架构里面高内聚低耦合,自己内部的事情就不要暴露出来,外部接口尽量简单,所以在设计上就符合软件设计的理念,封装性还具有安全性了,不想让外部访问的时候可以屏蔽。

面向对象,面向对象思想是什么? 第21张 面向对象,面向对象思想是什么? 产品运营

2.继承性

就是把之前已经实现好的代码或者方法通过继承的方法拿过来使用,能节省大量的代码量,符合代码设计里面的继承优秀代码特性,而且写好的类还能给后来的人继续使用,面向对象语言更能形象的称之为站在巨人的肩上

面向对象,面向对象思想是什么? 第22张 面向对象,面向对象思想是什么? 产品运营

3.多态性

由于可以继承多个类,能够组合成多种特性,但多态的关键是覆盖,就是同一个方法可以用不同的方式去实现,展现出多态性。

虽然看似这些概念很简单,说起来要比较容易,还是要真正在项目中去体现,真正通过代码来验证自己的想法,通过大型的项目实战再回归研究这些基本的概念,就会对这个设计者充满无线的钦佩。

面向对象,前端是否适合使用面向对象的方式编程?

这里是丁哥开讲,作为一名从事20多年软件开发的资深程序员,我来说一下我的体会。

前端开发当然可以使用面向对象编程概念。在这个基础上我在着重强调一下,面向对象编程,不仅对前端非常有用,对后端当然也是非常有用的。我们这个问题就专门针对前端来谈一谈。

前端我们关注的是界面的设计。那么一个界面之中会分为几个区域,每个区域里面又分为几个子区域。这些大大小小的区域我们都可以定义为一个对象,俗称组件。这些组件可能会有一些共性,比如说都会有初始化函数和释放函数。那么我们就可以把这些共性的方法放到一个基本组件里面,俗称基类。

基本组件可以定义为抽象的组件也可以定义为实际使用的组件。基本的方法也可以手工调用也可以靠整个架构来进行自动的调用。如果你用过angular,vue, react这些架构的话,我相信你知道我在说什么。

除了组件的设计和定义以外,在前端也需要定义一些非界面性的类,或者其他的逻辑单元,这些非界面的类和逻辑单元,用来存储前端的数据和逻辑计算。如果对这一部分使用面向对象变成概念的话,会降低程序的复杂度,增加程序的可维护性和可扩展性。

如果你使用typescript, 这样的面向对象编程语言来开发前端的话,那自然的,你已经有面向对象编程的概念了。这门语言是Javacript的超集。如果你有面向对象编程的经验,学习学好这门语言根本不在话下。

即使你在使用JavaScript, 你也可以通过函数的方法来定义原型基类,然后通过在扩展的函数里面定义扩展原型,这样你新的函数既可以享有原有函数的所有方法也可以添加上新的功能实现这实际上就是父类和子类的一个概念。

实际上所有的typescript代码,最后在运行的时候都需要编译成JavaScript。

也就是说所有的typeacript面向对象的编程方法,在编译后的JavaScript, 你都可以找到对应的例子。

说完了 JavaScript相关的知识, 再来说一下前端开发离不开的样式语言。现在比较流行的样式语言是sass家族, 诸如less, scss。他们最终都会编译成传统的CSS语言。所不同的是这些流行的样式语言提供了面向对象的编程概念。在写这些样式语言的时候,可以像面向对象语言一样使用基本的类,扩展的类,基本的函数和扩展的函数。与此同时,这些新的样式语言都支持数结构。那么数结构本身就有子节点,父节点的概念。这是文档模型DOM本身的对应关系。

这一步也就引申到了html语言本身。这门标记语言自身作为一棵树存在。通过这棵树你可以追溯到你想要的那一部分内容。这个过程本身就是把整个文档作为一个树对象来进行操作的。

好了,以上是我作为一名资深程序员的个人见解,请在下方留言告诉我你的想法,我们可以继续探讨,感谢关注丁哥开讲我们下次再见。

面向对象,面向对象思想是什么? 第23张 面向对象,面向对象思想是什么? 产品运营

有话要说...

最新文章