面向对象和面向过程,是两种不同的处理问题的角度。
面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)、及各自需要做什么。
比如:洗衣机洗衣服
面向过程会将任务拆解成一系列的步骤(函数),1、打开洗衣机——>2、放衣服——>3、放洗衣粉——>4、清洗——>5、烘干
面向对象会拆出人和洗衣机两个对象:
人:打开洗衣服、放衣服、放洗衣粉
洗衣机:清洗、烘干
从以上例子能看出,面向过程比较直接高效,而面向对象更易于复用、扩展和维护。
面向对象的三大特征
封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项
内部细节对外部调用不透明,外部调用无需修改或者关心内部实现
1.javabean的属性私有,提供getset方法对外访问,因为属性的赋值或者获取逻辑只能由javabean本身决定。而不能由外部胡乱修改。
2.orm框架
操作数据库,我们不需要关心链接是如何建立的、sql是如何执行的,只需要引入mybatis,调方法即可。
继承:继承基类的方法,并做出自己的改变和扩展。
子类共性的方法或属性直接使用父类的,而不需要自己再定义,只需要扩展个性化的。
多态:多态是同一个行为具有多个不同表现形式或形态的能力。基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
多态存在的三个必要条件:继承,方法重写,父类引用指向子类对象
父类类型 变量名 = new 子类对象; 变量名.方法名();
无法调用子类特有的功能
public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 对象调用 show 方法 show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eat Cat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } } abstract class Animal { abstract void eat(); //Note:父类中没有work方法 } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } } 执行以上程序,输出结果为: 吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠