面向对象和面向过程,是两种不同的处理问题的角度。
面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)、及各自需要做什么。
比如:洗衣机洗衣服
面向过程会将任务拆解成一系列的步骤(函数),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("看家");
}
}
执行以上程序,输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠