详解Java面向对象之多态的原理与实现

 更新时间:2022年05月28日 11:28:40   作者:小刘要努力(ง •̀_•́)ง  
多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。本文将详解多态的原理与实现,感兴趣的可以学习一下

何为多态

定义:

多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。系统在运行时(而非编译时),能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性。

特点:

(1)多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。

(2)多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。

(3)对不同类的对象发出相同的消息将会有不同的行为。

(4)多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。

(5)多态分为编译时多态(函数参数个数不同或者参数类型不同)和运行时多态(虚函数和纯虚函数)。

作用:

(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承

(2)派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

(3)隐藏实现细节,使得代码能够模块化(虚函数)。

代码实现

运算类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : Operation
 * @description : [运算类]
 * @createTime : [2022/5/27 20:04]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:04]
 * @updateRemark : [描述说明本次修改内容]
 */
public abstract class Operation {
 
    private double _numberA;
    private double _numberB;
 
    public double get_numberA() {
        return _numberA;
    }
 
    public void set_numberA(double _numberA) {
        this._numberA = _numberA;
    }
 
    public double get_numberB() {
        return _numberB;
    }
 
    public void set_numberB(double _numberB) {
        this._numberB = _numberB;
    }
 
    public abstract double getResult();
}

加法类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationAdd
 * @description : [加法类]
 * @createTime : [2022/5/27 20:13]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:13]
 * @updateRemark : [描述说明本次修改内容]
 */
public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        double result = 0;
        result = super.get_numberA() + super.get_numberB();
        return result;
    }
}

减法类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationSub
 * @description : [减法类]
 * @createTime : [2022/5/27 20:13]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:13]
 * @updateRemark : [描述说明本次修改内容]
 */
public class OperationSub extends Operation {
    @Override
    public  double getResult() {
        double result = 0;
        result = super.get_numberA() - super.get_numberB();
        return result;
    }
}

乘法类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationMul
 * @description : [乘法类]
 * @createTime : [2022/5/27 20:15]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:15]
 * @updateRemark : [描述说明本次修改内容]
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
        double result = 0;
        result = super.get_numberA() * super.get_numberB();
        return result;
    }
}

除法类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationDiv
 * @description : [除法类]
 * @createTime : [2022/5/27 20:16]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:16]
 * @updateRemark : [描述说明本次修改内容]
 */
public class OperationDiv extends Operation {
    @Override
    public double getResult() {
        double result = 0;
        if (super.get_numberB() == 0) {
            System.out.println("除数不能为0");
        } else {
            result = super.get_numberA() / super.get_numberB();
        }
        return result;
    }
}

简单工厂类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationFactory
 * @description : [简单工厂类]
 * @createTime : [2022/5/27 20:16]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:16]
 * @updateRemark : [描述说明本次修改内容]
 */
public class OperationFactory {
    public static Operation createOperation(String operate) {
        Operation operation = null;
        switch (operate) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
        }
        return operation;
    }
}

客户端主方法类:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : Main
 * @description : [客户端]
 * @createTime : [2022/5/27 20:18]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:18]
 * @updateRemark : [描述说明本次修改内容]
 */
public class Main {
    public static void main(String[] args) {
        Operation operation;
        operation=OperationFactory.createOperation("+");
        operation.set_numberA(1);
        operation.set_numberB(2);
        System.out.println(operation.getResult());
    }
}

多态理解

我们都知道封装是为了让类的调用者不需要知道类的实现细节,而多态能让类的调用者连这个类的类型是什么都不必知道,只需要知道这个对象具有某个方法即可。

因此,多态可以理解成是封装的更进一步,让类调用者对类的使用成本进一步降低,提高程序的可扩充性、可维护性、可复用性。

以上就是详解Java面向对象之多态的原理与实现的详细内容,更多关于Java多态的资料请关注脚本之家其它相关文章!

相关文章

  • Java数组与二维数组及替换空格实战真题讲解

    Java数组与二维数组及替换空格实战真题讲解

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素,这篇文章主要介绍了Java数组与二维数组及替换空格实战真题讲解
    2022-07-07
  • mybatis-plus如何配置自定义数据类型TypeHandle

    mybatis-plus如何配置自定义数据类型TypeHandle

    这篇文章主要介绍了mybatis-plus如何配置自定义数据类型TypeHandle,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java Mybatis框架增删查改与核心配置详解流程与用法

    Java Mybatis框架增删查改与核心配置详解流程与用法

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录
    2021-10-10
  • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    本篇文章主要介绍了SpringMVC的相关知识。同时也会介绍到js、css这些静态文件的加载配置,以及服务器推送的两种实现方式并且给出了两者的区别。下面跟着小编一起来看下吧
    2017-04-04
  • 基于Maven导入pom依赖很慢的解决方案

    基于Maven导入pom依赖很慢的解决方案

    这篇文章主要介绍了Maven导入pom依赖很慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 一篇文章带你搞懂Java线程池实现原理

    一篇文章带你搞懂Java线程池实现原理

    线程池无论是工作还是面试都是必备的技能,但是很多人对于线程池的实现原理却一知半解,并不了解线程池内部的工作原理,今天就带大家一块剖析线程池底层实现原理
    2022-11-11
  • java实现查找PDF关键字所在页码及其坐标

    java实现查找PDF关键字所在页码及其坐标

    这篇文章主要介绍了java实现查找PDF关键字所在页码及其坐标的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • springboot 使用自定义的aspect的示例代码

    springboot 使用自定义的aspect的示例代码

    这篇文章主要介绍了springboot 使用自定义的aspect的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 图文详解OkHttp的超时时间

    图文详解OkHttp的超时时间

    HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽,OkHttp是一个高效的HTTP客户端,下面这篇文章主要给大家介绍了关于OkHttp超时时间的相关资料,需要的朋友可以参考下
    2021-10-10
  • IDEA使用properties配置文件进行mysql数据库连接的教程图解

    IDEA使用properties配置文件进行mysql数据库连接的教程图解

    Properties类是 键和值均为字符串的可以永久存储到文件中的key-value集合。这篇文章主要介绍了IDEA使用properties配置文件进行mysql数据路连接 ,需要的朋友可以参考下
    2018-10-10

最新评论