我们经常说Java是一门面向对象的语言,那么面相对象和传统的面向过程有哪些区别呢?面向对象的三大特征是指什么?它们各自的特点又是什么呢?这就是我们今天所要讨论和学习的内容!
1.1 面向对象和面向过程的区别
1.什么是面向对象?
对比面向过程,只是两种不同的处理问题的角度
面向过程注重做事情的步骤与顺序;而面向对象则更注重事情有哪些参与者 (对象)、以及各自都需要做什么
2.面向过程和面向对象的区别
举个生活中的例子:我们平常用洗衣机来洗衣服
如果是面向过程,它会将洗衣服这件事拆解成一系列的步骤 (函数)
- 先打开洗衣机
- 然后放水和衣服
- 接着放洗衣粉
- 再然后清洗衣服
- 最后将衣服甩干
面向对象则会将洗衣服拆解成两个对象,即洗衣机和人:
- 比如人负责打开洗衣机,放衣服、水和放洗衣粉
- 而洗衣机这个类呢,只负责清洗衣服和甩干就可以了
从洗衣服这个例子我们可以得知:
- 面向过程这种将事情拆成一系列步骤的行为会比较直接和高效
- 而面向对象将事物属性和方法抽象出来,虽然不如面向过程那么直接高效,但这样做的好处是让代码变得更加易于复用,给扩展功能和后期的维护带来了极大便利
这里就引出了另外一个问题,到底什么是抽象呢?
3.什么是抽象?
抽象其实就是将一类对象的共同特征给总结出来并构造类的过程,包括数据抽象和行为抽象两方面 (也就是Java实体类对象的属性和方法)
而且抽象只关心对象有哪些属性和行为,所以并不关注这些行为的细节是什么
1.2 面向对象的三大特征
面向对象的三大特征:即封装、继承和多态性
1.2.1 封装
1.封装是指什么?
可以说封装是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口
比如,可以想一下普通洗衣机和全自动洗衣机的区别,与普通洗衣机相比,全自动洗衣机显然因为封装的更好,因此操作起来更加简单;再比如我们经常使用的智能手机,只靠几个简单的按键就可以轻松完成很多事情,显然也是封装足够好的结果
2.面向对象的本质是什么?
- 其实面向对象的本质,就是把现实世界描绘成一系列完全自治、封闭的对象
3.那么封装的意义是什么?
1.2.2 继承
1.什么是继承?
- 继承是从已有类 (基类或者父类)中得到继承信息,然后创建新类(子类或者派生类)的过程
- 简单理解,就是继承基类 (父类) 的方法,并做出自己的一些改变或者拓展
2.继承的好处是什么?
1.2.3 多态性
1.什么是多态性?
- 很多资源上的定义是,多态性是指允许不同子类型的对象对同一消息作出不同的响应
- 简单来说就是用同样的对象引用调用同样的方法但是做了不同的事情
- 还有一种理解是,基于对象所属类的不同,外部对同一个方法调用后,而实际执行的逻辑不同
2.多态性案例解释
2-1 实现步骤
继承,方法重写,父类引用指向子类对象
2-2 测试代码
- 比如定义一个Person类,拥有性别,年龄和性别等属性
package com.kuang.pojo;
public class Person {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package com.kuang.pojo;
public class Student extends Person {
@Override
public String getName() {
return super.getName();
}
public void setName(String name) {
super.setName(name+"同学");
}
}
? Teacher老师类
package com.kuang.pojo;
public class Teacher extends Person {
@Override
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name+"老师");
}
}
- 编写MyTest测试类,分别使用父类引用不同的子类对象
package com.kuang.test;
import com.kuang.pojo.People;
import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
public class MyTest {
public static void main(String[] args) {
People p1 = new Student();
People p2 = new Teacher();
People p3 = new People();
p1.setName("张三");
p2.setName("罗翔");
p3.setName("法外狂徒");
System.out.println(p1.getName());
System.out.println(p2.getName());
System.out.println(p3.getName());
}
}
2-3 测试结果
3.多态的分类
3-1 多态分为哪几种?
多态分为运行时的多态性和编译时的多态性
3-1 什么是运行编译时多态
方法重载 (overload) 是实现编译时的多态性 (也称前绑定) ,而方法重写 (override) 实现的是运行时的多态性 (也称后绑定)
3-2 什么是运行时多态?
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态可以解释为:
- 当系统A去访问系统B提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的
- 就好比电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者使用交流电,甚至可能是太阳能,A系统只会调用B类对象供电的方法,但并不了解供电系统的底层实现是什么,究竟通过何种方式获得了动力
运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事情:
- 方法重写:子类继承父类并重写父类中已有的或者抽象的方法
- 对象造型:用父类型引用子类型对象,这样同样的引用调用同样的方法时就会根据子类对象的不同而表现不同的行为
好了,今天有关面向对象和面向过程的区别、以及面向对象的三大特征的学习就到此结束了,欢迎大家学习和讨论!
参考视频链接: https://www.bilibili.com/video/BV1Eb4y1R7zd (B站UP主图灵学院程序员Mokey)
参考博客链接: https://blog.csdn.net/jackfrued/article/details/44921941 (Java面试题全集(上))
|