上大学时,有一门公共课,名字叫做面向对象编程。课程内容是C++,但上完两学期,我也不能很好的理解面向对象的概念。
直到学习了java,感受到了,对象的概念深入骨髓的感觉。仅仅因为对“方法”的调用语法,就让我了解了面向对象的意义。
首先,我们要了解面向对象,要知道与面向对象对应的是什么,不面向对象的话,它是面向哪里呢?
答案是面向过程。一些基础编程语言比如C,就是面向过程的。
那面向过程和面向对象分别是怎样的概念呢,他们之间的区别在哪,为什么要面向对象而不面向过程。
来举一个生活中的小例子吧:
比如,我们要描述做饭的话,我们要说,买菜、摘菜、洗菜、切菜、炒菜、盛菜,这就是面向过程。
当我们每天都需要做饭的时候,我们不想这么麻烦了,我们把这个过程,统称为做饭。
于是做饭 = {买菜、摘菜、洗菜、切菜、炒菜、盛菜},做饭成为了一个函数,C++叫函数,java叫方法。
这也就是我们要说的面向对象的特性之一,封装性。(概念不需深入理解,且把故事听完。)
面向对象是对面向过程的一种升级,二者并非格格不入,而类似一种包含关系。
好的,现在我们有了“做饭”的“方法”。当我们吃饭的时候,不能直接“做饭”。
为什么?因为得有人会做饭,才能“做饭”啊。
所以,以家庭为例,我们有了一个对象,叫老婆,她具备“做饭”这个方法。
当我们想吃饭的时候,我们调用 老婆.做饭,就可以吃到可口的饭菜了!
(哈哈,这里没有性别歧视,只是一个例子,莫怪莫怪。)
老婆厨艺越来越好,只会一种做饭还不行,要会做早饭、午饭、晚饭,给家人做家常菜,家里来客人了还要做招待客人的饭菜。
于是老婆就会有很多个做饭的方法。这些做饭的方法,应用的场景有所区别,内容也有不同。
而这些方法又同属于做饭,如果每个都要换名字,不仅程序很复杂,调用起来也会很麻烦。
于是我们就干脆都叫“做饭”,然后通过接收不同的参数来达到区分他们的效果。
这就是面向对象的第二个特性,多态。
后来剧情又发展了,夫妻二人生了一个女儿。
女儿跟老婆学做饭,学化妆,学怎样相夫教子。(也可以学习编程技术,只是举例哈。)
我们不想再给女儿写一遍“做饭”“化妆”“相夫教子”,因为这些内容在老婆那里已经写过了。
于是,我们让女儿直接继承老婆。
这就是面向对象的第三个特性,继承。
有没有发现,不知不觉,我们已经将一个现实世界,用一个程序的结构描述了出来?这就是面向对象!
它是一种思维模式,也是这种思维模式下产生的程序设计方法。
这样设计出来的程序,可以很容易的复用、扩展,提高我们的效率。