《深入理解 Java 中的多态性》

目录

一、多态性的基本理解

二、Java 中多态性的体现:虚拟方法调用

编译时与执行时的行为差异

三、多态的使用前提

要有类的继承关系

要有类的重写

四、多态的适用性

五、多态的好处与弊端

好处

弊端


一、多态性的基本理解

多态性,简单来说,就是一个事物可以呈现出多种形态。就好比在现实生活中,一个人可以同时拥有多种身份,在不同的场景下展现出不同的行为特点。在 Java 编程的语境中,多态性使得同一个操作在不同的对象上会产生不同的执行结果,这为我们编写灵活且可维护性高的代码提供了强大的支持。

二、Java 中多态性的体现:虚拟方法调用

编译时与执行时的行为差异

在多态场景下调用方法时,会出现一种很有意思的现象。在编译阶段,Java 编译器会认为是在调用方法左边声明的父类的类型的方法。而到了执行时,实际指向执行的却是子类重写的那个方法。我们通常把这种情况简称为 “编译看左边,运行看右边”。

下面通过一个简单的代码案例来更好地理解这一点:

class Animal {public void makeSound() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog();Animal animal2 = new Cat();animal1.makeSound(); // 编译时看作Animal类的makeSound方法,运行时执行Dog类重写的makeSound方法,输出:汪汪汪animal2.makeSound(); // 编译时看作Animal类的makeSound方法,运行时执行Cat类重写的makeSound方法,输出:喵喵喵}
}

在上述代码中,我们定义了Animal类作为父类,DogCat类作为子类并分别重写了makeSound方法。在main方法中,我们创建了DogCat类的对象,但将它们声明为Animal类型的引用。当调用makeSound方法时,就体现了 “编译看左边,运行看右边” 的多态特性。

三、多态的使用前提

要在 Java 中实现多态,需要满足两个重要的前提条件:

要有类的继承关系

就像我们上面的例子中,DogCat类继承自Animal类一样。通过继承,子类可以继承父类的属性和方法,并且可以在这个基础上进行扩展和重写,这为多态性的实现奠定了基础。

要有类的重写

子类需要对父类的某些方法进行重写,以实现自己特定的行为逻辑。只有这样,在多态调用时,才能根据实际对象的类型执行子类重写后的方法,而不是仅仅执行父类的原始方法。

四、多态的适用性

多态性在 Java 中主要适用于方法,而不适用于属性。这是因为当我们通过父类引用指向子类对象时,虽然可以调用被子类重写的方法,但对于属性来说,访问的始终是父类中定义的属性(即使子类中可能也有同名属性)。例如:

class Parent {protected int value = 10;
}class Child extends Parent {protected int value = 20;
}public class Main {public static void main(String[] args) {Parent parent = new Child();System.out.println(parent.value); // 输出:10,访问的是父类的属性值}
}

在这个例子中,尽管创建的是Child类的对象,但通过父类引用访问value属性时,得到的是父类中定义的属性值。

五、多态的好处与弊端

好处

多态性为我们的代码带来了极大的便利,其最大的好处就是能够极大地减少代码的冗余。想象一下,如果没有多态,我们可能需要为不同类型的对象分别定义多个重载的方法来实现类似的功能。而有了多态,我们只需要在父类中定义一个通用的方法,然后让各个子类根据自身的需求重写该方法即可。这样不仅使代码更加简洁,也提高了代码的可维护性和扩展性。

弊端

然而,多态性也并非完美无缺。例如,当我们像这样创建对象:Person p2 = new Man();(假设ManPerson的子类),在内存中虽然已经加载了Man类中声明的特有的属性和方法,但由于声明为父类引用,导致我们没有办法直接调用Man中加载的特有的属性和方法。也就是说,在多态的场景下,我们创建了子类的对象,也加载了子类特有的属性和方法,但因为引用类型是父类的,所以无法直接访问子类特有的那些属性和方法。这在某些情况下可能会给我们的编程带来一些不便,需要我们通过一些其他的方式(比如类型转换)来解决这个问题。

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

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

相关文章

可编辑71页PPT | 企业架构及典型设计方案

荐言分享:企业架构(Enterprise Architecture, EA)是战略与技术之间的桥梁,旨在确保企业的信息系统、业务流程、组织结构和技术基础设施能够协同工作,以支持企业的整体战略目标。它通过定义一套标准化的框架、原则、模型…

python代码获取zabbix上机器磁盘使用率

1.需要先给机器打上标记os_type: Linux或者os_type: Windows 2.代码请求获取数据: 先装一下相关的数据包 pip install pyzabbix from pyzabbix import ZabbixAPI import requests import urllib3 import concurrent.futuresclass ZabbixInfo():def __init__(self…

一个完整的crm系统都应该具备哪些功能?CRM系统功能盘点

前段时间我们去拜访一位企业老板,正好他们在开会,团队正在讨论如何与一位潜在的大客户达成交易。 客户对产品表现出浓厚的兴趣,也提出了一些具体的问题,例如上一次交易的详细信息、服务响应时间以及可能的折扣方案,但…

导师双选系统开发:Spring Boot技术详解

第一章 绪论 1.1 选题背景 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,尽管身边每时每刻都在产生大量信息,这些信息也都会在短时间内得到处理,并迅速传播。因为很多时候,管理层决策需要大量信…

CTF顶级工具与资源

《Web安全》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484238&idx1&snca66551c31e37b8d726f151265fc9211&chksmc0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene21#wechat_redirect 《网安面试指南》h…

数列分块入门

本期是数列分块入门。其中的大部分题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:here (其实是对之前分块的 blog 的整理补充) sto hzwer orz %%% [转载] ---------------------------------------------------------------------------------…

模型自动绑骨,在线生成动画,神奇的网站《Mixamo》

英文名mixamo 网站地址:Mixamohttps://www.mixamo.com/#/首先进入需要注册,国内的手机号就可以,但是会有一些慢,多试几次 1、进入界面如下 2、载入自己的模型 2、绑定骨骼 拖动这几个有颜色的圈圈分别对应右图位置,点…

2024 CSS保姆级教程四

CSS中的动画 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块​ 即指元素从一种样式逐渐过渡为另一种样式的过程​ 常见的动画效果有很多,如平移、旋转、缩放等等&#…

Docker安装anythingllm

拉镜像 docker pull mintplexlabs/anythingllm 启动 anythingllm docker run -d --name anythingllm --add-hosthost.docker.internal:host-gateway --env STORAGE_DIR/app/server/storage --health-cmd "/bin/bash/usr/local/bin/docker-healthcheck.sh || exit 1"…

格行:从新晋网红到国货之光,它究竟做对了什么?

作为一家迅速崛起的新消费品牌,近两年来,格行饱受质疑。 无论是商家还是消费者,都有人对其爱之恨之,喜欢它的人,认为它是正义的化身,价格的屠夫,国货的骄傲,原本需要花几百才能买到…

小菜家教平台(二):基于SpringBoot+Vue打造一站式学习管理系统

目录 前言 今日进度 详细过程 一、数据库重构 二、编写登录接口 相关知识点 前言 昨天我们重启了小菜家教平台的开发,创建了新项目并初步进行了配置,今天我们继续。大家要是有需要源码的话可以在评论区跟我说,博客中就不添加源码了~ 今…

数学期望和联合概率密度

数学期望的定义 数学期望是描述随机变量平均趋势的一个重要统计量。根据随机变量的类型(离散或连续),数学期望的定义有所不同。 离散型随机变量的数学期望: 若离散型随机变量 X X X取值为 x 1 , x 2 , … , x n , … x_1,x_2,\do…

MRCTF2020:你传你ma呢

文件上传题先判断黑白名单过滤,先传个最简单的木马 这里上传不了php文件,猜测可能是对php文件进行了过滤,将文件改为任意后缀这里改为.abc 还是上传不成功,猜测可能对MIME也做了过滤,将Content-Type更改为image/jpeg再…

Harmony项目基础

项目基础 开发环境 DevEco Stuio下载和安装 DevEco Studio下载 下载链接:https://developer.huawei.com/consumer/cn/deveco-studio/ 安装IDE 直接运行安装文件即可 配置SDK及工具链 DevEco Studio 提供 SDK Manager 统一管理 SDK 及工具组件,包括如下组件包&…

《使用Gin框架构建分布式应用》阅读笔记:p307-p392

《用Gin框架构建分布式应用》学习第16天,p307-p392总结,总86页。 一、技术总结 1.AWS chapter 08讲使用AWS进行部署,可以根据需要选择是否阅读。因为使用到的概率很小,且还要绑卡,本人选择跳过。 2.CI/CD (1)什么…

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大 时间:2023年 机构:北京邮电大学 发表在:IEEE TRANSACTIONS ON MULTIMEDIA, VOL. 25, 2023 代码源码地址: pytorch版本:https://github.com/dyh…

windows下安装jdk并配置环境

【1】安装jdk 这里建议傻瓜式安装,不要自定义路径,直接下一步下一步。 在Windows系统中安装JDK并设置环境变量(包括JAVA_HOME和CLASSPATH)是一个常见的任务。 1. 下载并安装JDK 访问Oracle官方网站或其他可信来源下载JDK安装包…

云安全真知实践 国内头部能源企业全面灵活云安全方案大公开

能源与安全,是两个紧密相连的齿轮,驱动着当今社会的运转与发展。能源是动力源泉,而安全则是守护这一动力的坚实支撑,保障着能源系统的运作与敏感数据的安全。 亚信安全一直以来为国内能源行业提供着安全保障,从石油、…

Photoshop 2025重磅来袭 :全新功能炫耀安装!Adobe全家桶

2024年10月,备受期待的Adobe Photoshop 2025正式版如约而至。每年的十月份,Adobe都会带来其软件的重要更新,而今年的Photoshop 2025则在改进和新功能方面做出了重磅升级,让创意工作者和设计师们倍感振奋。 新界面与核心功能 Ph…

【Java面试——计算机基础——网络——一篇就够了!!!】

1. 网络分层模型 1.1 OSI七层模型 OSI 七层模型 是国际标准化组织提出的一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和…