Java:多态

文章目录

  • 一、概念
  • 二、使用前提
  • 三、实例
  • 四、优缺点
    • 4.1 优点
    • 4.2 缺点
  • 五、动态绑定和静态绑定
    • 5.1 动态绑定
    • 5.2 静态绑定

一、概念

多态是指类的多种形态,同一个接口,使用不同的实例而执行不同操作。


二、使用前提

  • 有继承/实现关系
  • 有父类引用指向子类对象
  • 有方法的重写

三、实例

这是一个实现多态的例子,具体看注释信息:

public class Test {public static void main(String[] args) {// 创建对象 (多态方法)Animal animal = new Dog();// 访问成员变量:编译看左,运行也看左// 编译看左:当程序编译时,系统会去父类查看是否存在当前变量,如果存在,编译成功,不存在,则编译报错// 运行看左:当程序运行时,系统实际会去调用父类的成员变量System.out.println("====== 成员变量 ======");System.out.println(animal.name);// 访问成员方法:编译看左,运行看右// 编译看左:当程序编译时,系统会去父类查看是否存在当前方法,如果存在,编译成功,不存在,则编译报错// 运行看右:当程序运行时,系统实际会去调用子类的成员方法System.out.println("====== 成员方法 ======");animal.show();
}// 动物类
class Animal {String name = "动物";public void show() {System.out.println("Animal === show()");}
}// 狗类
class Dog extends Animal {String name = "狗";@Overridepublic void show() {System.out.println("Dog === show()");}
}// 猫类
class Cat extends Animal {String name = "猫";@Overridepublic void show() {System.out.println("Dog === show()");}
}

运行结果:

====== 成员变量 ======
动物
====== 成员方法 ======
Dog === show()

四、优缺点

4.1 优点

  • 在多态的形式下,右边的子类对象可以实现解耦合,便于扩展和维护;
  • 当定义方法时,你可以使用父类来作为方法的参数,这样就可以接受所有的子类对象,体现了多态的灵活性。

4.2 缺点

  • 不能使用子类的特有方法,因为当使用多态的形式去调用方法,它会去看父类有没有这个方法,如果没有则报错。

注:可以通过强制类型转换解决,具体看下列代码

细节:强制转换时,转换的类型和创建时对象的类型必须保持一致,不然会报错,可以使用

instanceof关键字,判断对象的类型。

强制类型装换

public class Test {public static void main(String[] args) {// 创建对象 (多态方法)Animal animal = new Dog();// 调用狗类特有方法 (强制类型转换)Dog dog = (Dog) animal;dog.eat();}
}// 动物类
class Animal {String name = "动物";public void show() {System.out.println("Animal === show()");}
}// 狗类
class Dog extends Animal {String name = "狗";@Overridepublic void show() {System.out.println("Dog === show()");}// 特有方法public void eat() {System.out.println(name + "吃食物");}
}

instance 关键字

public class Test {public static void main(String[] args) {// 创建对象 (多态方法)Animal animal = new Dog();// 调用狗类特有方法 (instance 关键字)if (animal instanceof Dog dog) {dog.eat();}}
}// 动物类
class Animal {String name = "动物";public void show() {System.out.println("Animal === show()");}
}// 狗类
class Dog extends Animal {String name = "狗";@Overridepublic void show() {System.out.println("Dog === show()");}// 特有方法public void eat() {System.out.println(name + "吃食物");}
}// 猫类
class Cat extends Animal {String name = "猫";@Overridepublic void show() {System.out.println("Dog === show()");}
}

运行结果:

狗吃食物

五、动态绑定和静态绑定

5.1 动态绑定

动态绑定是多态的基础,也叫运行时绑定,动态绑定的关键在于,当我们通过一个引用调用一个方法时,JVM会检查对象的实际类型,然后决定调用哪个方法。如果在父类和子类中都定义了相同的方法(即方法重写),那么将调用的是子类中的方法。

5.2 静态绑定

静态绑定,也称为早期绑定或编译时绑定,是在编译阶段就确定方法调用的过程。与动态绑定不同,静态绑定在编译时就能确定将要调用哪个方法,不需要等到运行时。

在Java中,以下几种情况会使用静态绑定:

  • 成员变量访问:当访问类的成员变量时,无论引用是什么类型,都会直接访问对象的实际类型中的变量,但是这个访问在编译期就已经确定了,所以属于静态绑定。
  • static静态方法调用:静态方法属于类而不属于对象,所以在调用静态方法时,不会发生动态绑定,而是直接调用该类的静态方法,这属于静态绑定。
  • final方法调用:如果一个方法被声明为final,那么这个方法不能被子类重写,所以在调用这个方法时,会直接调用父类的final方法,这属于静态绑定。
  • 构造器调用:构造器的调用也是在编译时期就确定的,属于静态绑定。

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

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

相关文章

centos7部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突,所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

19.JWT

1►JWT博客推荐 阮老师讲得很好了,网址如下: http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 2►ry是怎么践行JWT的呢? 问题一:不登录的时候有token吗? 答:没有,所…

[概念]探索AI与AIGC:从定义到应用场景

一、什么是人工智能(AI)? 人工智能(Artificial Intelligence,AI)正成为科技革命和产业变革的核心推动力。AI是研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新兴技术科学&#xf…

Uniapp的简要开发流程指南

Uniapp开发指南 简介 Uniapp 是由DCloud推出的一款基于Vue.js的多端开发框架,支持编译到iOS、Android、H5、以及各大小程序平台(如微信小程序、支付宝小程序、百度小程序等)。它使开发者可以通过一次编码,实现跨平台的应用发布&…

blender 纹理绘制-贴花方式

贴画绘制-1分钟blender_哔哩哔哩_bilibili小鸡老师的【Blender风格化角色入门教程】偏重雕刻建模https://www.cctalk.com/m/group/90420100小鸡老师最新的【风格化角色全流程进阶教程】偏重绑定。早鸟价进行中!欢迎试听https://www.cctalk.com/m/group/90698829, 视…

[C++][CMake][嵌套的CMake]详细讲解

目录 0.前言 & 准备1.节点关系2.添加子目录3.解决问题1.根目录2.calc目录3.sort目录4.calc_test目录5.sort_test 4.注意 0.前言 & 准备 如果项目很大,或者项目中有很多的源码目录,在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#…

Splunk Enterprise 中的严重漏洞允许远程执行代码

Splunk 是搜索、监控和分析机器生成大数据的软件领先提供商,为其旗舰产品 Splunk Enterprise 发布了紧急安全更新。 这些更新解决了几个构成重大安全风险的关键漏洞,包括远程代码执行 (RCE) 的可能性。 受影响的版本包括 * 9.0.x、9.1.x 和 9.2.x&…

ARM架构和Intel x86架构

文章目录 1. 处理器架构 2. ARM架构 3. Intel x86架构 4. 架构对比 1. 处理器架构 处理器架构是指计算机处理器的设计和组织方式,它决定了处理器的性能、功耗和功能特性。处理器架构影响着从计算机系统的硬件设计到软件开发的各个方面。在现代计算技术中&#…

论如何搭建属于自己的服务器?

在现如今的数字化时代中,为了能够搭建网站和运行应用程序,很多人选择搭建属于自己的服务器,下面我们就来了解一下如何搭建服务器吧! 搭建服务器我们首先需要选择适合自身需求的硬件设备,其中包含内存、CPU和存储等配置…

计算机组成原理学习笔记(一)

计算机组成原理 [类型:: [[计算机基础课程]] ] [来源:: [[B站]] ] [主讲人:: [[咸鱼学长]] ] [评价:: ] [知识点:: [[系统软件]] & [[应用软件]] ] [简单解释:: 管理计算机系统的软件; 按照任务需要编写的程序 ] [问题:: ] [知识点:: [[机器字长]] ] [简单…

广告联盟小游戏app开发搭建看广告收益项目

以下是关于广告联盟小游戏 APP 开发搭建看广告收益项目的一般步骤和要点: 项目规划 明确游戏的类型、玩法和目标受众。确定通过广告获取收益的模式和策略。 技术选型 选择适合的开发框架和技术栈,如移动开发框架(如 React Native、Flutter 等…

第6篇 共识机制深度解析:PoW、PoS、DPoS和PBFT

在区块链的世界里,有一个非常重要的概念叫做“共识机制”。它就像是区块链的心脏,保证大家在这条链上的信息是可靠的、不可篡改的。今天,我们就来通俗易懂地聊聊区块链里的四大共识机制:工作量证明(PoW)、权益证明(PoS)、委托权益证明(DPoS)和拜占庭容错(PBFT)。为…

绝区壹--LLM的构建模块

前言 语言是人类交流的本质,大型语言模型 (LLM) 凭借其出色的理解和生成类似人类的文本的能力,彻底改变了我们与语言互动和利用语言的方式。深入研究 LLM 的构建块(向量、标记和嵌入),揭示了使这些模型能够以前所未有…

辣子简报芬芳喜事特辑

【辣子简报芬芳喜事特辑】🎉在这个季节的尾声,当一缕阳光温柔地洒在打包好的行囊上,我们不约而同地停下了忙碌的脚步,回望那段共同编织的璀璨时光——79天的并肩作战,如同一段精彩绝伦的旅程,如今已缓缓驶向…

3D地图是智慧城市可视化项目绕不开的技术!来我帮你解决

**3D地图:智慧城市可视化项目绕不开的技术!来我帮你解决** 智慧城市已成为未来城市发展的必然趋势。而3D地图作为智慧城市可视化项目的核心技术之一,其重要性不言而喻。本文将深入探讨3D地图在智慧城市建设中的应用及其优势,为您…

Android - SIP 协议

SIP 代表(会话发起协议)。 它是一种协议,可让应用程序轻松设置呼出和呼入语音呼叫,而无需直接管理会话、传输级通信或音频记录或回放。 SIP 应用程序 SIP 的一些常见应用是。 视频会议即时消息 开发要求 以下是开发 SIP 应用程序的要求 − Android 操作系…

2-5 softmax 回归的简洁实现

我们发现通过深度学习框架的高级API能够使实现线性回归变得更加容易。 同样,通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上节中一样, 继续使用Fashion-MNIST数据集,并保持批量大小为256。 import torch from torc…

黑马的ES课程中的不足

在我自己做项目使用ES的时候,发现了黑马没教的方法,以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…

展开说说:Android服务之startService源码解析

通过上一篇文章我们掌握了Android四种的基本使用,本篇从源码层面总结一下startService的执行过程。 本文依然按着是什么?有什么?怎么用?啥原理?的步骤来分析。 1、是什么 上一篇总结了“Service是Android系统中的四…

Apache Seata新特性支持 -- undo_log压缩

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata新特性支持 – undo_log压缩 Seata新特性支持 – undo_log压缩 现状 & 痛点…