什么是面向对象?
面向对象其实是相较于面向过程的,与面向过程相比,面向对象实际上是另外一种处理问题的角度,或者说思想。
面相过程呢更注重事情的每一个步骤以及顺序,而面向对象更注重于事情有哪些参与者(也就是对象),以及各自需要去做什么。
可以拿生活中的实例来理解面向过程与面向对象,(摘自百度百科) 例如五子棋
面向过程的设计思路就是首先分析问题的步骤:
1、开始游戏,
2、黑子先走(看我抢占中心c位),
3、绘制画面(我画我画我画画画),
4、判断输赢(一颗棋子赢个毛啊),
5、轮到白子(看我当头炮???),
6、绘制画面(我画我画我画画画),
7、判断输赢(咦?玩的不是围棋吗?),
8、返回步骤2,
9、输出最后结果(当然是当头炮赢啦!)。
把上面每个步骤用不同的方法来实现。
而面向对象的设计则是从另外的思路来解决问题。
整个五子棋可以分为
1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面,
3、规则系统(有我在看谁敢作弊),负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
由此可见面向过程是比较直接高效,而面向对象易于复用,扩展和维护。
面向对象三大特点
而说到面向对象,就一定要提起它的三大装X特点:封装,继承,多态
1.封装
封装的意义在于明确标识出允许外部使用的所有成员函数和数据项
内部细节对外部调用透明,外部调用无需修改或者关心内部实现.
就像java主流的orm框架里的MyBatis框架,引入后,就无需关心链接是如何建立的,sql是如何执行的,只需要调用其中的方法就可以了。
简单来说就像是打电话,你只需调用打电话的程序,拨打号码,就能进行通话,而不用去关心,电话是如何与信号塔连接,以及声音是如何通过电话传播的。
这样做也避免了,外部胡乱修改已经设计好的逻辑功能(我也想修改,可是我会吗???)。
更简单来说,去饭店,你只管吃做好的饭,而不用去管是如何做的,甚至还要去教教厨师怎么做饭。
2.继承
继承的目的是为了让类共性的方法或属性被提取出来成一个全新的类,每个类如果需要使用该属性或方法,可以直接继承这个新的类,去调用所需要的属性或方法,而不用自己再去定义,也避免了每个类需要使用一个相同的方法和属性时都要重新定义一次。这个全新的类称为父类,继承它的类称为子类。除此之外子类还能扩展自己的功能,实现个性化与功能化,也可以重写父类的方法。
就拿车来举例,一辆汽车有运行的功能,自行车也有运行的功能,火车也有运行的功能,于是把他们共有的方法提取出来重新写一个交通工具类,里面有一个运行的方法。于是不管是汽车还是自行车,或者是火车,只要继承了这个类,就直接可以调用运行的方法,而不用自己去定义啦。(真的好方便啊!)
而假如自行车不想要普通的运行,它想要飞着走(你咋不上天呢),便可以重写父类的方法,去实现新的功能。当然在我看来继承本就是一种约束,它规定了子类的某一种行为,而重写恰恰破坏了这种无形的约束,也破坏了继承体系,同时也违背了里氏替换原则。(你不需要我的功能干嘛要继承我呢?哼!生气!)当然也是要视情况而定的。如果真要改变为什么不采用其他方式去进行聚合或者依赖呢,也有可能是我理解太浅,只看到了片面的东西。
3.多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,所以不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
当使用多态方式调用方法时,首先会检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
而多态存在有三个必要条件
1.继承
2.重写
3.父类引用指向子类对象(向上转型):Parent p = new Child();
举例来说打印机分为彩色打印机类和黑白打印机类,他们都继承于打印机这个类,而打印机有打印的功能,彩色打印机重写了打印的功能,变成了打印彩色文件,而黑白打印机也重写了打印的功能,变成了打印黑白文件。
如果要打印彩色文件
打印机 打彩 = new 彩色打印机();
然后调用打印的方法。
如果要打印黑白文件
打印机 打黑白 = new 黑白打印机();
然后调用打印的方法。
这都是父类的引用指向了子类对象。
这样不管以后再出现什么打印机都可以直接去切换指向去调用方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
而有种不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。一般,使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
这是我自己一点片面的理解,如果有什么不对,请一定要不吝赐教,在此感谢啦!