【从零开始学习JAVA | 第十五篇】 多态

news2024/11/15 21:30:22

前言:

本篇我们来解释一下什么是多态关系,多态关系属于面向对象三大特征的最后一个,可以说面向对象的重点就在多态,因此我们要学好面向对象编程思想,就要学好多态。

多态:

        Java中的多态是指同一类对象在不同情况下可能表现出不同的形态和行为。它包括了方法重载方法重写两种形式。

        方法重载是指在同一个类中定义了两个或多个方法,它们的方法名相同,但参数类型、个数或顺序不同。当程序调用这个方法时,根据传入的参数类型自动匹配最合适的方法进行执行。

        方法重写是指子类重写父类的某一个方法,方法名和参数列表都必须相同。当程序调用该方法时,会首先查找子类中是否存在该方法,如果存在则执行子类中的方法,如果不存在则会向上查找父类中是否有该方法,直到找到为止。

        多态使得同一类对象可以表现出不同的行为,增强了程序的灵活性和扩展性,也是面向对象编程的基本特征之一。在Java中,多态实现通过继承、接口和抽象类等机制来实现。

多态的表现形式:

  • 父类类型 名称 =子类对象;

多态的前提:

  • 有继承关系。
  • 有父类引用指向子类对象。
  • 有方法重写。

多态调用成员变量特点:

  • 变量调用:编译看左边,运行看右边。

  • 方法调用:编译看左边,运行看右边

package testo1;

public class test02 {
    public static void main(String[] args) {
        //利用多态创建对象。
        Animal a= new dog();
        //调用成员变量是编译看左边,运行看左边。
        System.out.println(a.name);
        //调用成员方法:
        //编译看左边,运行看右边。
       a.show();
    }

}
class Animal{
    String name ="动物";
    public void show()
    {
        System.out.println("animal-------show");
    }

}

class dog extends Animal{
    String name ="狗";
    @Override
    public void show ()
    {
        System.out.println("dog---------show");
    }

}
class cat extends Animal{
    String name ="狗";
    @Override
    public void show ()
    {
        System.out.println("cat---------show");
    }

}

运行结果:

在这个调用中我们可以发现:成员变量会随着建立对象的不同而不同。例如我们明明是Animal类型的对象,却打印了dog里面的方法。

如果子类对父类方法进行了重写,那么在虚方法表中是会对父类的方法进行覆盖的。

其实可以类比于C++里面的多态,感兴趣的同学可以点击这篇文章进行观看

C++ 动态多态实现底层逻辑_我是一盘牛肉的博客-CSDN博客

多态的优点:

1. 增强程序的灵活性:通过多态机制,同一个类型的不同对象可以表现出不同的行为。这使得程序的调用方式更加灵活,可以针对不同的对象调用不同的方法,无需为每一个具体对象都单独编写方法。

2. 提高代码的复用性:通过抽象类和接口,多态能够很好地实现代码的复用。在编写抽象类和接口时,我们可以定义一些通用的方法和属性,这些方法和属性可以被具体的子类继承和实现,从而减少代码的重复编写。

3. 提高程序的可扩展性:通过多态机制,在程序的运行过程中,可以动态地替换对象的行为。这使得程序的扩展性更加优秀,增加新的功能时,只需要添加新的类和方法即可,无需修改已有的代码。

4. 提高程序的可维护性:多态使得代码更加松散耦合,不同的类之间的关系更加清晰明了。这使得程序的维护性更好,对于模块性较强的程序,修改和维护的难度大大降低。

因此,多态在面向对象编程中具有重要的作用,能够提高程序的灵活性、可复用性、可扩展性和可维护性。

多态的缺点:

1. 程序执行效率略低:由于多态的实现需要动态绑定,即在运行时才能确定对象的类型和方法的执行地址,所以程序的执行效率会略微降低。

2. 代码可读性不高:由于多态性质的特殊性,程序中可能出现一个方法被多次重载、覆盖的情况,这样会使得代码的可读性变差,不容易理解。

3. 可能会造成误解或错误:由于父类无法完全限制子类的行为,所以在使用多态时,很容易陷入到某些无法预知的情况下,例如仅仅使用父类的属性而忽略了子类的某些特殊属性或方法,从而出现意外结果或错误。

虽然多态存在一些缺点,但是这些缺点可以通过适当的编码和测试来避免。在实际编程中,正确使用多态,在对程序的可维护性、可扩展性以及灵活性等方面都具有重要意义。

 因为父类不可以调用子类的特有功能,因此例如我们在子类中的函数,如果我们的创建对象是父类,那么就无法使用这个方法,因此我们在JAVA中设置了转型

转型:

多态的转型是指通过类型转换,将一个对象在继承关系中沿着层次向上或向下进行类型转换,在转型过程中可以访问不同层次的方法和变量。

在Java中,类型转换分为向上转型向下转型两种:

  • 向上转型:将子类转换为父类对象,这种转换不需要进行特殊处理,自动完成向上转型。例如:Animal animal = new Cat(),Cat类是Animal类的子类,在这里就进行了向上转型。
  • 向下转型:将父类对象转换为子类对象,需要强制类型转换才能实现。例如:Cat cat = (Cat) animal,在这里需要将Animal类型的对象进行强制类型转换为Cat对象,才能实现向下转型。

需要注意的是,在进行向下转型之前,必须进行向上转型,否则会报错。另外,在进行向下转型时,必须保证进行转换的对象是正确的类型,否则也会报错。

下面给出一个Java多态中的类型转换示例,通过向上转型和向下转型操作,来演示多态的转型过程:


interface Animal {
    public void eat();
}

class Cat implements Animal {
    public void eat() {
        System.out.println("Cat eat fish.");
    }

    public void meow() {
        System.out.println("Cat say meow.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();

        Cat cat = (Cat) animal;
        cat.eat();
        cat.meow();
    }
}

在上述代码中,首先定义了一个接口 Animal,包含一个抽象方法 eat()。接着,定义一个实现了 Animal 接口的类 Cat,并且在 Cat 类中实现了 eat() 方法和 meow() 方法。在主方法中,创建了 Animal 类型的引用 animal,并将其设置为 Cat 类的实例。由于 Cat 类是 Animal 类的子类,因此可以进行向上转型。接着对 animal 调用 eat() 方法,输出“Cat eat fish.”。

接下来进行向下转型,在将 Animal 类型的引用 animal 转换为 Cat 类型的引用 cat。在向下转型后,可以调用 Cat 类特有的方法 meow(),输出“Cat say meow.”。

需要注意的是,在进行向下转型之前,必须进行向上转型。否则将会出现编译错误。同时,当进行向下转型时,必须进行类型检查,保证进行转换的对象是正确的类型。否则将会出现运行时错误。

总结:

多态更加丰富了子类与父类之间的关系网,更加完善了JAVA的功能,学好面向对象三大特征很重要,各位要熟练掌握这里的内容,才可以更加娴熟的使用JAVA。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nssctf之SSRF刷题记录

[NISACTF 2022]easyssrf 题目讲的主要是ssrf以及php伪协议的能力,题目详情如下 一般来说,当一个网站出现curl类的功能时就可能会出现ssrf之类的漏洞,常见的ssrf协议如下 file:/// dict:// sftp:// ldap:// tftp:// gopher://file:// 这种…

基于python的matplotlib、numpy库实现的图形绘制(数据可视化)

一、sin,cos函数 1.题目要求 编写程序,绘制正弦曲线和余弦曲线。 提示:利用numpy的linspace()、sin()或cos()函数生成样本数据、正弦或余弦值。 2.函数讲解及代码 import matplotlib.pyplot as plt import numpy as np#linspace函数是用…

【MySQL数据库 | 第二十篇】explain执行计划

目录 前言: explain: 语法: 总结: 前言: 上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的…

kubernetes入门案例

kubernetes入门案例 本文我们通过一个 Java Web 应用例子来介绍 kubernetes 的使用,可以让新手快速上手和实践。 此 Java Web 应用的结构比较简单,是一个运行在 Tomcat 里的 Web App,JSP 页面通过 JDBC 直接访问 MySQL 数据库并展示数据。…

青梅产业成立“国家队”,溜溜梅迎来树立品牌良机?

扩大内需在今年政府工作报告中被频频提及。国务院发展研究中心原副主任王一鸣认为,激活潜在消费需求,将释放中国超大规模市场的经济增长潜力。 如今,休闲零食市场也正在经历这样一场激活潜在需求的变革。无论是洽洽食品、三只松鼠、良品铺子…

Kubernetes(k8s)容器编排概述

目录 1 k8s 是什么2 K8s的由来2.1 K8s发展历程2.2 发展时间线 3 为什么使用k8s3.1 什么是容器3.2 什么是 Kubernetes3.3 K8s 的著名优势特色3.3.1 一个平台搞定所有3.3.2 云环境无缝迁移3.3.3 高效的利用资源3.3.4 开箱即用的自动缩放能力3.3.5 使 CI/CD 更加简单3.3.6 可靠性 …

香橙派 1. 上手,配置wifi以及vnc

0. 环境 香橙派4以及电源 读卡器 32GB TF卡 1. 重新烧写固件 Orangepi4_2.1.2_ubuntu_bionic_desktop_linux4.4.179.img 用sd card formatter 格式化TF卡 安装Win32DiskImager,打开,选择IMG,确认U盘,点击写入。 2. 插上TTL 注意…

Mybatis相关知识(2)

Mybatis相关知识 今天接着上期mybatis相关知识进行讲解,今天主要是讲解mybatis和数据库相关的映射,标签和SQL编写等。 会结合实际业务和代码进行讲解。 1 占位符和传参的相关问题 先来看两条xml的SQL。第一条SQL从id名称可知,是根据id删除数…

cookie、session、token学习笔记

一.cookie 1.什么是cookie? Cookie用于存储web页面的用户信息。 Cookie是一些数据,存储于你电脑的文本文件中。 当web服务器向浏览器发送web页面时,在连接关闭后,服务端不会记录用户的信息。 而Cookie的作用就是用于解决“如…

【unity每日一记】 三大金星之(音频Audio + 碰撞和触发+光源组件)

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

Kubernetes(k8s)部署模式发展

目录 1 简介2 物理单机(~2000)2.1 主要代表 3 虚拟化:初期(2001~2009)3.1 VMware3.2 laaS 4 虚拟化:成熟期(2010~至今)4.1 OpenStack4.2 虚拟化四巨头 5 容器化:(2013-至今)5.1 Dock…

【从零开始学习JAVA | 第十三篇】继承

目录 前言: 引入: 继承: 小拓展: 优点: 成员方法的继承问题: 总结: 前言: 继承是面向对象三大特性之一,它是在封装之后我们讲解的一个重要的性质,继承…

【Kubernetes资源篇】DaemonSet控制器入门实战详解

文章目录 一、DaemonSet控制器理论知识1、DaemonSet控制器是什么?2、DaemonSet控制器工作原理3、DaemonSet典型应用场景4、DaemonSet与Deployment的区别 二、案例:DaemonSet控制器实战演示1、使用DaemonSet部署日志收集组件2、DaemonSet管理Pod滚动更新 …

数据库期末复习大总结 数据库课程学习资料(包含数据库全部章节的经典例题)【我的数据库期末复习】

为刚开始上大学数据库课程 提供学习方向【我的数据库期末复习】 第一章 绪论1.1 数据库系统概述 第二章 关系数据库2.1 关系的基本概念2.2 关系的完整性 关系数据库标准语言SQL3.1.1 SQL创建模式和表3.1.2 SQL修改和删除表3.2.1 SQ单表查询3.2.2 分组聚合和分组过滤3.2.3 多表联…

Matplotlib---散点图

1. 散点图 scatter函数用于绘制散点图。下面是scatter函数的语法格式: scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, edgecolorsNone, **kwargs)参数解释: x:指定散点的…

【二分查找】详细图解

目录 一.什么是二分查找法? 二.算法要求 三.算法思想 图解(要找的数k的值为3) 参考代码 一.什么是二分查找法? 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是&am…

GEE:DYNAMICWORLD/V1数据集介绍

作者:CSDN @ _养乐多_ 本文将介绍GOOGLE/DYNAMICWORLD/V1数据集。 在Dynamic World数据集中,每个波段代表了某个特定类别的土地覆盖概率。这些概率表示了一个像素完全被某种土地覆盖类别所覆盖的可能性,其取值范围从0到1。每个波段的名称和描述指示了对应类别的土地覆盖类…

成为CSDN创作者的第2048天,我收获了什么?

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

linux下容器 安装 操作 介绍

介绍: 容器是一种轻量级的虚拟化技术,可以将应用程序及其依赖项打包到一个独立的运行环境中,从而实现快速部署、可移植性和可扩展性。容器可以在不同的操作系统和云平台上运行,使得应用程序的部署和管理变得更加简单和高效。 安…

八大指针笔试题带你overcome指针

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《C语言》专栏,本专栏是针对于大学生,编程小白精心打造…