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

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

对象的类型转换

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

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

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

如文件1所示。

文件1 Example16.java

    // 定义接口Animalinterface 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.xdnf.cn/news/150624.html

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

相关文章

数据结构与算法学习day23-回溯算法-递增子序列

一、递增子序列 1.题目 491. 非递减子序列 - 力扣(LeetCode) 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xf…

深入理解端口、端口号及FTP的基本工作原理

FTP是TCP/IP的一种具体应用,FTP工作在OSI模型的第七层,TCP模型的第四层上,即应用层,FTP使用的是传输层的TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,其…

路面坑洼与道路缺陷目标检测数据集——(路面裂缝目标检测数据集——含10000多张图像 数据集已按照yolo txt格式标注好)

路面坑洼,道路缺陷,路面裂缝目标检测数据集 共包含10000多张图像,包含纵向裂缝、纵向拼接缝、错误标签、横向裂缝、横向拼接缝、龟裂、坑洞、十字路口模糊、白线模糊、井盖十个标签,依次对应D00到D50, 其中D01、D0W0、…

3D全息投影简易制作:用矿泉水瓶制作反射镜面、剪映制作3D投影视频

参看视频:https://www.bilibili.com/video/BV1HW411H7B3/?vd_source34d74181abefaf9d8141bbf0d485cde7 3D全息投影:主要是反射衍射原理 1、用矿泉水瓶制作反射镜面 参看:https://www.iesdouyin.com/share/video/7005120687492828416 2、剪映…

鸿蒙跨端实践-长列表解决方案和性能优化

这是我参加创作者计划的第一篇文章。 前言 长列表是前端和客户端应用中最常见的业务场景,比如商品瀑布流等,有成千上万条数据,因此长列表的渲染性能在iOS,Android,Harmony,Web等各大平台都非常重要。Harmon…

uni-app进度条

<template><view><canvas canvas-id"ring" id"ring" style"width: 200px; height: 180px;"><!-- <p>抱歉&#xff0c;您的浏览器不支持canvas</p> --></canvas></view> </template><…

Frp经常连接不上?查看Frp常见问题排查

很多使用Frp的网友反馈使用Frp经常出现无法使用或者不稳定的情况&#xff0c;Frp编译和部署比较复杂&#xff0c;多端口映射时或者连接数多的情况下会出现不稳定的现象&#xff0c;不适合小白使用&#xff0c;而且仅是上一代的内网穿透技术&#xff0c;生产环境使用建议选择稳定…

Linux创建用户配置虚拟环境

文章目录 前言一、创建新用户二、下载安装Anaconada总结 前言 本篇文章用于记录拿到一个新的Linux服务器开始创建一个新的用户&#xff0c;并配置深度学习所需要的环境。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、创建新用户 创建用户&…

苏轼为何要写石钟山记?时间节点是关键

《石钟山记》不仅是苏轼的旅行笔记&#xff0c;亦是其人生哲学与思想的深邃自省。文中不仅详述了他对石钟山的实地勘察&#xff0c;亦体现了其对历史、自然及人生之独到见解。黄州生涯及其对政治与文化的洞悉&#xff0c;为这篇作品注入了深厚底蕴。 苏轼的黄州岁月 黄州期间…

使用现有的科技或许无法实现对人类智能的模拟

现有科技在实现真正的人类智能方面面临许多挑战。科技的局限性涉及许多领域&#xff0c;在计算能力方面&#xff0c;尽管处理速度不断提升&#xff0c;但要模拟人脑的复杂性仍然困难重重&#xff1b;当前的人工智能依赖于大量数据进行训练&#xff0c;缺乏灵活性和适应性&#…

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 通过状态模式&#xff0c;可以消除通过 if-else…

Sam Altman最新博文:智能时代将带来无限的智能和丰富的能源

9 月 23 日&#xff0c;Sam Altman 发布了一篇名为《The Intelligence Age》 的博客文章。Altman 强调&#xff0c;未来的科技进步将让我们做出在祖辈看来近乎“魔法”的成就&#xff0c;AI 的加速创新将成为推动这些 变革的核心力量。 Altman 解释说&#xff0c;历史上人类之所…

MySQL数据库脚本转化成sqlite数据库脚本的修改点

转换数据类型 将MySQL的数据类型转换为SQLite对应的数据类型。例如&#xff0c;将 INT或 INTEGER 转换为 INTEGER&#xff0c;将 VARCHAR、TEXT 或 CHAR 转换为 TEXT&#xff0c;将 DATETIME 或 TIMESTAMP 转换为 TEXT 或 DATETIME&#xff08;SQLite没有专门的日期时间类型&am…

IM项目中即时消息管理的技术实现及优劣分析

基于TCP协议的实现 技术原理 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在IM项目中&#xff0c;使用TCP协议进行即时消息管理时&#xff0c;客户端和服务器之间首先建立连接。当发送消息时&#xff0c…

240924-Windows映射网络驱动器的方法

在Windows上加载网络盘&#xff08;映射网络驱动器&#xff09;可以通过以下步骤完成&#xff1a; 方法一&#xff1a;通过文件资源管理器 打开文件资源管理器&#xff1a; 可以按 Win E 打开&#xff0c;或者直接点击任务栏上的文件资源管理器图标。 点击“此电脑”&#x…

Java 安全认证和 Hadoop UGI 原理解析

Java 安全认证和 UGI 原理解析 一般来说&#xff0c;Java 安全认证主要通过自定义 Subject、LoginContext、LoginModule、Configuration 在 Java 中进行安全认证。 Subject 可以单独创建并通过 Subject#doAs 方法单独进行登录&#xff0c;但也可以传入 LoginContext 中&#x…

在Java中,关于final、static关键字与方法的重写和继承【易错点】

在Java中&#xff0c;关于final、static关键字与方法的重写和继承【易错点】 1.final方法不能被重写2.static方法不是重写&#xff0c;而是遮蔽3.final与static的组合4.final与继承5.static与继承 1.final方法不能被重写 如果父类中的方法被声明为final&#xff0c;那么这个方法…

Codeforces Beta Round 2 B. The least round way(线性DP/数论)

题目&#xff1a; There is a square matrix n  n, consisting of non-negative integer numbers. You should find such a way on it that starts in the upper left cell of the matrix;each following cell is to the right or down from the current cell;the way ends…

Facebook对现代社交互动的影响

自2004年成立以来&#xff0c;Facebook已经成为全球最大的社交媒体平台之一&#xff0c;改变了人们的交流方式和社交互动模式。作为一个数字平台&#xff0c;Facebook不仅为用户提供了分享生活点滴的空间&#xff0c;也深刻影响了现代社交互动的各个方面。本文将探讨Facebook如…

Lesson6 Python基础语法_5

列表和元组的概念 列表、元组&#xff1a;程序员在代码中批量表示数据的方式列表和元组的大部分功能都是相同的&#xff0c;但是有一个明显的差别&#xff1a;列表可以修改&#xff0c;但是元组不能修改列表相当于散装辣条&#xff0c;元组相当于袋装辣条 列表的创建和下标访问…