这是技术面试过程中经常问的问题,真要彻底的讲明白,不是一件很容易的事情。可以简单的用C语言和C 两种语言的本质区别来具体解释,首先从设计模式来讲面向对象更加容易形成框架特性,现在高级语言基本上都支持面向对象,像java,python都是这个样子。
从事编程十几年两种思想的编程语言都有一些涉猎,整体给人感觉面相对对象更加容易理解,面向对象更加抽象,现在就一些具体的特性做一个大概的了解。
如何理解面向过程
面向过程和大家正常是思维模式接近,把一个问题按照从左到右,从上到下的解决方案分解成N个小步骤然后挨个去执行,说的再抽象一点就是模块化,具体实现通过函数来完成,函数里面又可以调用函数,最终功能点就是被无数个函数来完成。
从代码逻辑上分析,主函数main函数下面分成几个大的功能函数,这几个函数又被分解成无数个小函数完成,稍微复杂点开启多个线程异步处理一些功能,基本上就是面向过程的全过程了,非常容易理解,底层的功能模块也能别的功能模块共用,不能讲面向过程没有共用性,只不过相对框架性看起来差些,linux内核绝大部分代码都是C语言完成,如果没有框架性不可能这么稳定的运行,也正是这么灵活的功能模块调用,早就了高效,所以在某些领域C语言依然是编程首先,同时也是基石,现在很多编程语言的底层都是C语言来完成的。
如果能用C语言的框架把一个系统构建的十分完善并且具备很强的扩展性,一定是编程的高手,这主要靠内在功底把零散的东西有机的结合成一种框架,不像面向对象自带抽象模型体系。
如何理解面向对象
面向对象在模式上和面向过程截然不同,面向对象是先抽象一个模型,然后把这个模型实例化来使用,这个抽象模型就是大家经常听到的类的概念,类并不能直接去使用,而是需要直接实例化,所以做了很多年面向过程的老程序员,发现面向对象类必须实例化,特别是想调用里面其中的一个方法的时候,还需要拿到对方的实例,然后才能直接去调用,放在面向过程的编程里面是可以直接功能函数。
面向对象里面的类,其实是面向对象里面结构体的延伸,把这个概念放大化了。类主要是两个部分构成,属性和方法,属性就是变量,方法就是功能模块。当然面向对象最主要的概念是把事物抽象化,举个例子,把各种动物抽象成一个类,常见的狗,鸡鸭鹅等共有的属性,都有能走动的动作,都有脚属性,但不同的动物数量不一样,抽象成一个动物类,如果要弄一个狗的类首先继承一个动物类,并且把动物基本的特性继承过来,如果觉得有些方法差异太大就覆盖掉,同时增加新的特性封装成一个新的类,然后实例化进行具体使用,还可以同时继承多个类,拿到共性的方法或者属性,这样子能很好的继承已经有的功能,特别积累并且继承以前的功能。
面向对象在代码量上会比面向过程的会少一些,毕竟有些功能方法可以直接继承过来用,所以开发面向对象的程序员切换到面向过程会觉得特别不舒服,有些共有的方法直接继承过来去用非常顺其自然,面向过程调用更加突兀或者直接一点。面向对象在解决复杂是逻辑上更加占据一定的优势,而且越用越有感觉。
如何理解面向对象的三个特性?
1.封装性
就是把属性和方法都放在一个类里面,而且还可以通过访问类的权限属性给区分开,更加安全,不想要释放的功能,直接搞成私有机制,正好符合软件架构里面高内聚低耦合,自己内部的事情就不要暴露出来,外部接口尽量简单,所以在设计上就符合软件设计的理念,封装性还具有安全性了,不想让外部访问的时候可以屏蔽。
2.继承性
就是把之前已经实现好的代码或者方法通过继承的方法拿过来使用,能节省大量的代码量,符合代码设计里面的继承优秀代码特性,而且写好的类还能给后来的人继续使用,面向对象语言更能形象的称之为站在巨人的肩上
3.多态性
由于可以继承多个类,能够组合成多种特性,但多态的关键是覆盖,就是同一个方法可以用不同的方式去实现,展现出多态性。
虽然看似这些概念很简单,说起来要比较容易,还是要真正在项目中去体现,真正通过代码来验证自己的想法,通过大型的项目实战再回归研究这些基本的概念,就会对这个设计者充满无线的钦佩。