IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java面试基础篇之面向对象和面向过程的区别及面向对象三大特征 -> 正文阅读

[Java知识库]Java面试基础篇之面向对象和面向过程的区别及面向对象三大特征

我们经常说Java是一门面向对象的语言,那么面相对象和传统的面向过程有哪些区别呢?面向对象的三大特征是指什么?它们各自的特点又是什么呢?这就是我们今天所要讨论和学习的内容!

1.1 面向对象和面向过程的区别

1.什么是面向对象?

对比面向过程只是两种不同的处理问题的角度

面向过程注重做事情的步骤与顺序;而面向对象则更注重事情有哪些参与者 (对象)、以及各自都需要做什么

2.面向过程和面向对象的区别

举个生活中的例子:我们平常用洗衣机来洗衣服

如果是面向过程,它会将洗衣服这件事拆解成一系列的步骤 (函数)

  • 先打开洗衣机
  • 然后放水和衣服
  • 接着放洗衣粉
  • 再然后清洗衣服
  • 最后将衣服甩干

面向对象则会将洗衣服拆解成两个对象,即洗衣机和人:

  • 比如人负责打开洗衣机,放衣服、水和放洗衣粉
  • 而洗衣机这个类呢,只负责清洗衣服和甩干就可以了

从洗衣服这个例子我们可以得知

  • 面向过程这种将事情拆成一系列步骤的行为会比较直接和高效
  • 面向对象将事物属性和方法抽象出来,虽然不如面向过程那么直接高效,但这样做的好处是让代码变得更加易于复用,给扩展功能和后期的维护带来了极大便利

这里就引出了另外一个问题,到底什么是抽象呢?

3.什么是抽象?

抽象其实就是将一类对象的共同特征给总结出来并构造类的过程,包括数据抽象和行为抽象两方面 (也就是Java实体类对象的属性和方法)

而且抽象只关心对象有哪些属性和行为,所以并不关注这些行为的细节是什么


1.2 面向对象的三大特征

面向对象的三大特征:即封装、继承和多态性

1.2.1 封装

1.封装是指什么?
  • 通常认为封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口

  • 我们在类中编写的方法就是对实现细节的封装,我们编写一个类就是对数据和数据操作的封装

可以说封装是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口

比如,可以想一下普通洗衣机和全自动洗衣机的区别,与普通洗衣机相比,全自动洗衣机显然因为封装的更好,因此操作起来更加简单;再比如我们经常使用的智能手机,只靠几个简单的按键就可以轻松完成很多事情,显然也是封装足够好的结果

2.面向对象的本质是什么?
  • 其实面向对象的本质,就是把现实世界描绘成一系列完全自治、封闭的对象
3.那么封装的意义是什么?
  • 其实就在于明确标识出允许外部使用的所有成员函数(比如Java实体类的get和set方法)和数据项(比如Java实体类的属性或者字段)

  • 让内部细节对外部调用透明,这样一来,外部调用时就无需修改或者关心内部是怎样实现的

    1. JavaBean的属性私有,提供get和set对外访问,因为属性的赋值或者获取逻辑只能由JavaBean本身决定,而不能由外部胡乱修改

      public class User {
          private String name; //姓名
          public String getName() {
              return name;
          }
          public void setName(String name) {
              //该name有自己的命名规则,明显不可能由外部直接赋值
              this.name = "kuang"+name;
          }
      }
      
    2. ORM (Object Relationship Model) 框架
      比如操作数据库时,我们不需要关心数据库连接是如 何建立的,SQL语句是如何执行的,只需要引入mybatis,调用对应的增删改查操作即可


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;
    }
}
  • 分别定义继承于父类Person的子类Student和Teacher,都继承setName和setName方法

    Student学生类

package com.kuang.pojo;
//定义子类Student继承父类Person
public class Student extends Person {
    //重写getName方法
    @Override
    public String getName() {
        return super.getName();
    }
    //重写getName方法
    public void setName(String name) {
        super.setName(name+"同学");
    }
}

? Teacher老师类

package com.kuang.pojo;
//定义子类Teacher继承父类Person
public class Teacher extends Person {
    //重写getName方法
    @Override
    public String getName() {
        return super.getName();
    }
    //重写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面试题全集(上))

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:01:36  更:2021-08-03 11:02:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 11:51:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码