Java进阶_多态特性

生活中的多态

        多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

现实中,比如我们按下 F1 键这个动作,同一个事件发生在不同的对象上会产生不同的结果。

  • 如果当前在浏览器界面下弹出的就是浏览器的帮助文档;
  • 如果当前在 Word 下弹出的就是 Word 帮助;
  • 在 Windows 下弹出的就是 Windows 帮助和支持。

三个必要条件 

  • 继承,子类继承父类
  • 重写,子类重写了父类的方法(方法名和父类同名则称为子类重写了父类的这个方法)
  • 父类引用指向子类对象

class Shape {
    void draw() {}
}
  
class Circle extends Shape {
    void draw() {
        System.out.println("Circle.draw()");
    }
}
  
class Square extends Shape {
    void draw() {
        System.out.println("Square.draw()");
    }
}
  
class Triangle extends Shape {
    void draw() {
        System.out.println("Triangle.draw()");
    }
}

多态的实现方式 

方式一:重写

方式二:接口

方式三:抽象类和抽象方法

多态示例演示

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

要想调用父类中被重写的方法,则必须使用关键字 super

向上转型:Animal a = new Cat();(父类引用指向子类对象)

向下转型:Cat c = (Cat)a;(子类引用指向父类对象)

//动物类
abstract class Animal {  
    abstract void eat();  
} 
//猫类
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("看家");  
    }  
}
public class Test {

    public static void show(Animal a)  {
        //调用eat方法
        a.eat();  
        // 类型判断,如果对象是猫执行猫做的事,如果是狗执行狗做的事
        if (a instanceof Cat)  {
            Cat c = (Cat)a; 
            // 猫做的事情  
            c.work();  
        } else if (a instanceof Dog) {
            Dog c = (Dog)a;
            // 狗做的事情 
            c.work();  
        }  
    }  

    public static void main(String[] args) {
      // 以 Cat 对象调用 show 方法
      show(new Cat());
      // 以 Dog 对象调用 show 方法
      show(new Dog());
  }         
}

例子解析(结合代码仔细分析):

        show方法的参数是Animal对象,即父类对象。

        main方法中第一次调用show方法传入了子类对象,使用向上转型将子类对象(Cat)转为父类对象(Animal)的引用a,进入方法后,使用父类对象的引用a调用了eat方法,检查父类中是否有eat方法,如果没有则编译错误;如果有,则调用子类的同名方法,所以打印“吃鱼”。if语句中判断对象a属于Cat类的实例,使用向下转型将父类对象(Animal)的引用a转换为了子类对象(Cat)的引用c,使用子类对象的引用c调用work方法所以打印“抓老鼠”。

        main方法中第二次调用show方法传入了子类对象,使用向上转型将子类对象(Dog)转为父类对象(Animal)的引用a,进入方法后,使用父类对象的引用a调用了eat方法,检查父类中是否有eat方法,如果没有则编译错误;如果有,则调用子类的同名方法,所以打印“吃骨头”。if语句中判断对象a属于Dog类的实例,使用向下转型将父类对象(Animal)的引用a转换为了子类对象(Dog)的引用c,使用子类对象的引用c调用work方法所以打印“看家”。

多态的优点

  1. 消除类型之间的耦合关系,修改维护更方便简单。
  2. 可替换性,对已存在代码具有可替换性。
  3. 可扩充性,增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
  4. 接口性,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
  5. 灵活性,它在应用中体现了灵活多样的操作,提高了使用效率。
  6. 简化性,多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/690900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌上架防关联,打包环境到底是不是关联因素之一?

在Google play上架应用,防关联是开发者们最关注的问题之一,只要开发者账号被谷歌审核系统与其它违规的开发者账号或应用存在关联,就很有可能被封号。 如果账号被封了,通常谷歌的封号通知邮件里只是写了因为关联或高风险、多次违规…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项:仿真功能:仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…

2024年跨平台应用解决方法

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 很久没有写这类high-level的文章了,本身这类框架就一直层出不穷,但是其中历久弥坚,坚韧不拔的框架又有多少呢? 首先考虑到学习成本以及掌握一些编程语言在工作、学习生态上的价值,给这些东西适用生态划分一下. Reac…

基于JSP技术的文物管理系统

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

免费条形码生成工具,批量生成条形码

易条形是一款完全免费的条形码生成工具,可以帮助你快速生成条形码,支持生成18种条形码生成。 目前支持生成包括CODE128、CODE128A、CODE128B、CODE128C、EAN、EAN-13、UPC、EAN-8、EAN-5、EAN-2、CODE39、ITF14、MSI、MSI10、MSI11、MSI1010、MSI1110、…

ssm学生考勤签到小程序-计算机毕业设计源码43160

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受学生的喜爱,学生考勤签到小程序被学生普遍使用,为方便学生…

硕思闪客精灵(shankejingling)软件最新版下载及详细安装教程

闪客精灵(Sothink SWF Decompiler)是一款先进的SWF反编译软件,它不但能捕捉、反编译、查看和提取Shock Wave Flash影片(.swf和.exe格式文件),而且可以将SWF格式文件转化为FLA格式文件。它能反编译Flash的所…

人工智能、机器学习、深度学习:技术革命的深度解析

目录 人工智能、机器学习、深度学习:技术革命的深度解析 引言 第一部分:人工智能的起源与演进 1.1 人工智能的定义 1.2 人工智能的历史 1.3 人工智能的关键概念 1.4 人工智能的应用领域 1.5 人工智能的未来发展 1.6 人工智能的代码案例 第二部…

【乐吾乐3D可视化组态编辑器】用开关控制巡检车和路灯

一、运动设备开关控制 3D组态编辑器地址:3D可视化组态 - 乐吾乐Le5le 1.在场景中新建模拟运动设备及控制面板:启动/停止 2.单击巡检车设备新建模拟动画 3.设置模拟动画属性 4.单击启动面板,新建交互事件 5.设置交互触发类型,新建…

【vue2+css】实现球内波浪百分比效果

halo&#xff0c;小伙伴们&#xff0c;今天笔者分享一个关于css实现球内&#xff08;圆形&#xff09;波浪进度百分比效果&#xff0c;如下图所示&#xff1a; 话不多说上代码&#xff0c;首先是html代码&#xff1a; <div class"card1-left-bottom"><div …

SQL自动发送邮件的方法有哪些?如何配置?

SQL自动发送邮件设置时的注意事项&#xff1f;邮件群发如何操作&#xff1f; 在现代企业中&#xff0c;自动化流程越来越普遍&#xff0c;SQL自动发送邮件作为其中一项重要功能&#xff0c;能够大大提高工作效率并简化数据管理流程。AokSend将介绍几种实现SQL自动发送邮件的方…

SpringBoot整合SpringSecurit(二)通过token进行访问

在文章&#xff1a;SpringBoot整合SpringSecurit&#xff08;一&#xff09;实现ajax的登录、退出、权限校验-CSDN博客 里面&#xff0c;使用的session的方式进行保存用户信息的&#xff0c;这一篇文章就是使用token的方式。 在其上进行的改造&#xff0c;可以先看SpringBoot…

STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果&#xff0c;先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

前端工程化工具系列(十)—— Browserslist:浏览器兼容性配置工具

Browserslist 是一个能够在不同的前端工具间共享目标浏览器的配置&#xff0c;各工具根据该配置进行代码转译等操作。 具体的这些前端工具为&#xff1a;Autoprefixer、Babel、postcss-preset-env、eslint-plugin-compat、stylelint-no-unsupported-browser-features、postcss-…

Java开发-面试题-0004-HashMap 和 Hashtable的区别

Java开发-面试题-0004-HashMap 和 Hashtable的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活…

批量高效调整图片像素:自定义缩小bmp图片,画质优先,一键实现高效优化

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体分享&#xff0c;还是工作文件传输&#xff0c;图片总是扮演着重要的角色。然而&#xff0c;有时候&#xff0c;我们可能会面临一个问题&#xff1a;图片像素过大&#xff0c;不仅占用过多的存储空间&#xff0c;还可能…

【JavaSE】面向对象---多态

前言 本篇以Java初学者视角写下&#xff0c;难免有不足&#xff0c;或者术语不严谨之处。如有错误&#xff0c;欢迎评论区指正。本篇说明多态相关的知识。若本文无法解决您的问题&#xff0c;可以去最下方的参考文献出&#xff0c;找出想要的答案。 多态概念 多态&#xff08…

如何实现网站HTTPS访问

在当今网络安全至关重要的时代&#xff0c;HTTPS已经成为网站安全的基本标准。HTTPS&#xff08;超文本传输安全协议&#xff09;通过在HTTP协议基础上加入SSL加密层&#xff0c;确保了数据在用户浏览器和服务器之间的传输是加密的&#xff0c;有效防止数据被窃取或篡改&#x…

【学术小白成长之路】01三方演化博弈(基于复制动态方程) -基础概念与模型构建

1.演化博弈基础知识 经典博弈论起源于1944年Von Neumann和Morgenstern合著的《博弈论与经济学行为》&#xff0c;是研究理性决策者之间竞争和合作关系的数学方法。 博弈论主要研究完全理性的博弈个体为实现利益最大化而做的策略选择&#xff0c;在过去几十年取得了极大发展&am…