什么是面向对象?
面向对象相对比于面向过程,是两种不同处理问题的角度。
面向过程更注重于每一步骤和顺序,面向对象更注重事情有哪些参与者,和各自需要做什么。
例如:洗衣机洗衣服
- 面向过程会将任务拆解成一系列的步骤:
打开洗衣机→放衣服→放洗衣粉→清洗→烘干
- 面向对象会拆出两个对象(人和洗衣机):
人:打开洗衣机→放衣服→放洗衣粉
洗衣机:清洗→烘干
面向过程比较直接,面向对象更易于复用、扩展和维护(责任到人了属实是)。
面向对象的三大特征:封装,继承,多态
封装:
java的封装,跟地下城与勇士中的封装没有任何关系,玩DNF的勇士们请尽早撇清这两者关系。(本人初学的时候总是往那边想...)
java中封装的意义在于明确标识出允许外部使用的所有成员函数和数据项。
内部细节对外部调用透明,外部调用无需修改或者关心内部实现。
两个实际应用的例子:
- javabean:里面的属性私有,提供get,set对外访问。属性的赋值和获取只能由javabean本身决定,不能在外部胡乱修改。
- orm框架:如操作数据库,我们不需要关心连接如何建立,SQL如何执行,只需要引入mybatis,调用方法即可。
继承:
继承父类的方法,并做出自己的改变和拓展。
子类的方法和属性直接使用父类的,不需要再自己定义,只需要扩展个性化。
例如:
定义一个父,他会打泰拳,子类继承父类之后,子类也会打泰拳,但是还可以拓展,比如经过编写扩展之后,子类除了会打泰拳,还会正登,鞭腿,左刺拳。当然子类也可以个性化打泰拳,变成浑元形意太(泰)极拳。
多态:
基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
多态基于继承,并且要有“继承”,“方法重写”,“父类型引用指向子类型对象”这三个条件。
例如以下:
父类型 变量名 = new 子类对象();
变量名.子类方法名();
上边代码的子类对象可以换。
大致意思就是一个父亲如果有两个儿子,一个会浑元形意太极拳,另一个会醉梦罗汉拳。父类型的变量名就可以调用子类的拳法。
new一个会太极拳的子类,父类型的变量就可以调用太极拳;
new一个醉梦罗汉拳的子类,父类型的变量就可以调用罗汉拳。
但是,注意!!!
父类型的变量无法调用子类型特有的功能。
比如,一个子类后来学会了炖鸡汤,这个子类继承它父类的时候,并不会炖任何汤,是他后来自己学会,并且独有的。多态之后,父类型的变量也调用不了炖鸡汤这个方法。