【Java特性】多态详解——对象类型转换与 instanceof 关键字的运用

news2025/2/22 7:01:03

多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。多态不仅解决了方法同名的问题,而且还使程序变的更加灵活,从而有效的提高程序的可扩展性和可维护性。

对象的类型转换

在多态的学习中,涉及到将子类对象当做父类类型使用的情况,此种情况在Java的语言环境中称为“向上转型”,例如下面两行代码:

Animal an1 = new Cat(); // 将Cat类对象当做Animal类型来使用
Animal an2 = new Dog(); // 将Dog类对象当做Animal类型

需要注意的是,此时不能通过父类变量去调用子类特有的方法。

如文件1所示。

文件1 Example16.java

    // 定义接口Animal
    interface Animal {
        void shout(); // 定义抽象shout()方法
    }
    // 定义Cat类实现Animal接口
    class Cat implements Animal {
        // 实现接口shout()方法
        public void shout() {
            System.out.println("喵喵……");
        }
        // 定义Cat类特有的抓老鼠catchMouse()方法
        public void catchMouse() {
            System.out.println("小猫抓老鼠……");
        }
    }
    // 定义测试类
    public class Example16 {
        public static void main(String[] args) {
            Animal an1 = new Cat(); 
            an1.shout();
            an1.catchMouse();
        }
    }

程序编译报错,如图1所示。

                                                                图1 运行结果

从图1可以看出,程序编译出现了“The method catchMouse() is undefined for the type Anima(在父类Animal中未定义catchMouse()方法)”的错误。原因在于,创建Cat对象时指向了Animal父类类型,这样新创建的Cat对象会自动向上转型为Animal类,然后通过父类对象an1分别调用了shout()方法和子类Cat特有的catchMouse()方法,而catchMouse()方法是Cat类特有的,所以通过父类对象调用时,在编译期间就会报错。

因此要解决上面的问题,可以将父类类型的对象an1强转为Cat类型。接下来对文件1中的main()方法进行修改,具体代码如下:

// 定义测试类
public class Example16 {
    public static void main(String[] args) {
        Animal an1 = new Cat(); 
        Cat cat = (Cat) an1;
        cat.shout();
        cat.catchMouse();
    }
}

Java提供了一个关键字instanceof,它可以判断一个对象是否为某个类(或接口)的实例或者子类实例,语法格式如下:

对象(或者对象引用变量) instanceof 类(或接口)

// 定义测试类
public class Example17 {
    public static void main(String[] args) {
        Animal an1 = new Dog(); 
        if(an1 instanceof Cat){ // 判断an1本质类型
            Cat cat = (Cat) an1;
            cat.shout();
            cat.catchMouse();
        }else{
            System.out.println("该类型的对象不是Cat类型!");
        }
    }
}

再次运行程序,结果如图4所示。

                                                                图4 运行结果

在对文件2修改的代码中,使用instanceof关键字判断对象an1本质是否为Cat类型,如果是Cat类型就强制转换为Cat类型,否则就打印“该类型的对象不是Cat类型!”。由于判断的对象an1本质为Dog类型并非Cat类型,因此出现图4的运行结果。

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

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

相关文章

My_string 运算符重载,My_stack

思维导图 将My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) My_string my_string.h #ifndef MY_STRING_H #define MY_…

【论文】FunAudioLLM:一个旨在增强人类与大型语言模型(LLMs)之间自然语音交互的模型家族

研究背景 1.研究问题&#xff1a;这篇文章要解决的问题是如何增强人类与大型语言模型&#xff08;LLMs&#xff09;之间的自然语音交互。具体来说&#xff0c;研究集中在语音识别、情感识别和音频事件检测&#xff08;多语言&#xff09;以及语音生成&#xff08;多语言、零样…

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天&#xff0c;云原生 AI 20场主题分享&#xff0c;三展互动&#xff0c;为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

[单master节点k8s部署]24.构建EFK日志收集平台(三)

Kibana Kibana是elasticsearch的可视化界面。 首先创建kibana的服务&#xff0c;yaml文件如下。k8s里的服务分为四种&#xff0c;clusterIP为仅仅为pod分配k8s集群内部的一个虚拟ip&#xff0c;用于集群内的pod通信&#xff0c;而不对外暴露。elasticsearch的服务就是cluster…

Redis 优化

目录 优雅的 key 删除 Bigkey 恰当的数据类型 批处理优化 Pipeline 集群下的批处理 服务端优化 持久化配置 慢查询 命令以及安全配置 内存安全和配置 内存缓冲区配置 集群最佳实践 集群带宽问题 集群还是主从 优雅的 key 删除 Bigkey Bigkey 内存占用较多&…

线程池和JUC

1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.Stat…

微服务学习笔记之Docker

目录 认识Docker 安装Docker 安装yum工具 配置Docker的yum源 更新yum&#xff0c;建立缓存 安装Docker 启动并校验 配置镜像加速 Docker常见命令 命令 演示 给命令起别名 Docker数据卷 认识数据卷 数据卷常见命令 nginx的html目录挂载演示 数据卷挂载本地目录或…

强制类型转换

问题 最近在研读公司项目的时候发现一段很有意思的代码&#xff1a; if (a instanceof b) {B ent (B) a;if (!useGivenAuditAttributes) {ent.createdAt MyDateUtils.now();ent.createdBy AppContext.instance.loginUser.userId;ent.lastUpdatedAt ent.createdAt;ent.las…

如何把python(.py或.ipynb)文件打包成可运行的.exe文件?

将 Python 程序打包成可执行的 .exe 文件&#xff0c;通常使用工具如 PyInstaller。这是一个常用的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件&#xff0c;即使没有安装 Python 也能运行。 步骤&#xff1a; 1. 安装 PyInstaller 使用 conda 安…

【shell脚本5】Shell脚本学习--条件控制

目录 条件判断&#xff1a;if语句 分支控制&#xff1a;case语句 条件判断&#xff1a;if语句 语法格式&#xff1a; if [ expression ] thenStatement(s) to be executed if expression is true fi 注意&#xff1a;expression 和方括号([ ])之间必须有空格&#xff0c;否…

centos7 配置 docker 国内镜像源

1.修改配置文件/etc/docker/daemon.json sudo vim /etc/docker/daemon.json2.增加或修改以下配置内容 {"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","http…

谷歌浏览器如何更改下载文件存放的方式及其路径?

1、点击谷歌浏览器右上角的【三个点】 2、选择【设置】&#xff0c;再选择【下载内容】 3、打开【下载完成后显示下载内容】开关&#xff0c; 则&#xff1a;下载网页上的东西之后&#xff0c;会显示在【谷歌浏览器】的右侧&#xff0c;并显示具体下载文件在右侧&#xff1a;…

PR视频剪辑工具全指南:开启专业剪辑之旅

pr视频剪辑可以说是视频剪辑里的一把好手&#xff0c;就是如果你想在这方面深耕那还是掌握这个工具的使用比较方便。如果你只是刚入门&#xff0c;那也有不少可以快速帮你剪辑出片的工具。这次我介绍几款我用过的视频剪辑工具&#xff0c;助你开启视频剪辑大门。 1.福昕视频剪…

vue echarts tooltip动态绑定模板,并且处理vue事件绑定

先上代码&#xff1a; tooltip: {// 这里是车辆iconshow: true,// trigger: "item",// backgroundColor: "transparent",appendToBody: true,textStyle: {color: "#ffffff" //设置文字颜色},formatter: (params) > {const TruckTooltip Vue.…

Java-数据结构-排序(三) |ू・ω・` )

目录 ❄️一、归并排序&#xff1a; ☞ 基本思想&#xff1a; ☞ 代码&#xff1a; ☞ 归并排序的非递归方法&#xff1a; ❄️二、排序算法的分析&#xff1a; ❄️三、非基于比较的排序&#xff1a; ❄️总结&#xff1a; ❄️一、归并排序&#xff1a; ☞ 基本思想&#xf…

在一个.NET Core项目中使用RabbitMQ进行即时消息管理

为了在一个.NET Core项目中使用RabbitMQ进行即时消息管理&#xff0c;以下是详细的全程操作指南&#xff0c;包括安装、配置、编写代码和调试使用。 一、安装RabbitMQ 1. 安装Erlang RabbitMQ依赖Erlang&#xff0c;因此需要先安装Erlang。 Windows: 下载并运行Erlang安装…

人工智能-机器学习-深度学习-分类与算法梳理

目前人工智能的概念层出不穷&#xff0c;容易搞混&#xff0c;理清脉络&#xff0c;有益新知识入脑。 为便于梳理&#xff0c;本文只有提纲&#xff0c;且笔者准备仓促&#xff0c;敬请勘误&#xff0c;不甚感激。 请看右边目录索引 。 人工智能 三大派系 符号主义(Symbolists…

[附源码]宠物领养管理系统+SpringBoot

今天带来一款优秀的项目&#xff1a;宠物领养管理系统源码 。 系统采用的流行的前后端分离结构&#xff0c;内含功能包括"管理端"&#xff0c;“用户领养端”&#xff0c;“宠物管理”&#xff0c;“权限登录”等功能。 如果您有任何问题&#xff0c;也请联系小编&a…