向上转型和向下转型

转型

概念:Java数据类型转换是将一种数据类型的值转换为另一种数据类型的值。在Java中,数据类型转换可以分为两种:向上转型向下转型

向上转型

​ 是把子类对象当作父类对象来使用的过程(自动转型)。在向上转型中,我们创建一个子类对象并将其赋给一个父类类型的引用变量。这个过程不需要进行强制类型转换,因为子类对象始终可以被当作其父类类型的对象来处理。例如,如果有一个Animal类和一个继承自AnimalCat类,我们可以创建一个Cat对象并将其赋给一个Animal类型的引用变量。这样做的好处是可以访问该对象在父类中定义的属性和方法。

class Animal {String AnimalAttr = "Animal属性";public void eat(){System.out.println("动物吃饭");}public void sleep(){System.out.println("动物睡觉");}
}class Cat extends Animal{String catAttr = "Cat属性";public void shout(){System.out.println("小猫喵喵喵~~~");}@Overridepublic void sleep() {System.out.println("小猫睡觉");}
}public class Test01 {public static void main(String[] args) {Animal animal = new Cat();System.out.println(animal.AnimalAttr);animal.eat();animal.sleep();//animal.shout();报错}
}

运行结果:

Animal属性
动物吃饭
小猫睡觉

向下转型

​ 是将父类对象显式转换为子类对象的过程(强制转换)。在向下转型中,我们需要对父类引用进行强制类型转换以获得子类类型的引用。这种转换是有风险的,因为它可能导致ClassCastException,特别是当试图将一个实际上不是子类对象的父类对象向下转型时。因此,在执行向下转型之前,通常需要使用instanceof操作符来检查对象是否真的是子类的实例。

class Animal {
}
class Dog extends Animal{public void eat(){System.out.println("小狗吃骨头~~~");}
}
class Cat extends Animal{public void shout(){System.out.println("小猫:喵喵喵~~~");}
}
public class Test01 {public static void main(String[] args) {//错误示范:ClassCastException - 类型转型异常//原因:父类类型不能直接转换为子类类型//		Animal animal = new Animal();//		Dog dog = (Dog) animal;//		dog.eat();	//经验:向下转型之前,必须向上转型Animal animal = new Cat();if(animal instanceof Dog){//判断引用animal中所指向的对象是否是Dog类型Dog dog = (Dog) animal;dog.eat();}else if(animal instanceof Cat){//判断引用animal中所指向的对象是否是Cat类型Cat cat = (Cat) animal;cat.shout();}	}
}

运行结果:

小猫:喵喵喵~~~

注意

  • 向上转型后,可以调用父类非私有化的成员属性
  • 向上转型后,可以调用父类非私有化的成员方法
  • 向上转型后,不可以调用子类的成员属性和成员方法
  • 向上转型后,可以调用子类重写父类的方法
  • 总结来说,向上转型是安全且常用的,它允许我们利用继承关系中的"is-a"原则(每个子类对象都是其父类的一个实例),而向下转型则需要更多的注意,因为它涉及到类型兼容性的检查和潜在的运行时错误。

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

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

相关文章

FPGA+炬力ARM实现VR视频播放器方案

FPGA炬力ARM方案,单个视频源信号,同时驱动两个LCD屏显示,实现3D 沉浸式播放 客户应用:VR视频播放器 主要功能: 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文件播放 4.支持定制化配置…

36.Docker-Dockerfile自定义镜像

镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层机构,每一层都是一个layer BaseImage层:包含基本的系统函数库、环境变量、文件系统 EntryPoint:入口,是镜像中应用启动的命令 其他:在…

win32操作windows应用(未完成)

win32 脚本制作 一 、获取窗口句柄 首先获取句柄,其次扫描组件,然后对按钮和文本进行操作 安装依赖 pip install pywin32 -i https://pypi.doubanio.com/simple扫描全部的句柄 import win32gui# GetDesktopWindow 获得代表整个屏幕的一个窗口&#…

Blazor/Hybird 触屏下单程序调优笔记

环境 Blazor Net8.0 FreeSql Bootstrap Blazor 组件 以下都是自己瞎琢磨的和官网资料搬运,肯定有不少错漏和不合理的地方,非常希望各位大佬评论区给我建议和意见. 1. 组件化需要提升渲染性能的组件,例如触摸屏显示每个商品下单数量的商品列表 避免不必要地呈现组件子树, 执…

QT-小项目:连接MY SQL数据库实现登录(下一章实现登录注册账号和忘记密码功能)

一、环境准备 1、下载MYSQL 64位,安装完成,制作简易数据库教程如下: MY SQL安装 2、QT 编译器使用 二、实现工程目录(基于上一章基础上) 三、源程序增加内容如下: login.cpp 增加头文件: #in…

《TAM》论文笔记(上)

原文链接 [2005.06803] TAM: Temporal Adaptive Module for Video Recognition (arxiv.org) 原文代码 GitHub - liu-zhy/temporal-adaptive-module: TAM: Temporal Adaptive Module for Video Recognition 原文笔记 What: TAM: Temporal Adaptive Module for …

内网安全综合管理系统是什么 | 好用的内网安全管理系统有哪些

内网安全综合管理系统是指一种集成终端管理、网络管理、内容管理、资产管理等功能的综合性安全管理系统。它主要对内网上的主机进行统一安全管理,包括对网络主机用户操作实施监督控制,并对主机中的安全软件(如主机入侵监测系统、主机防火墙和…

关于提高 PHP 性能

解锁 PHP 性能:优化你的 Web 应用 在当今数字化世界中,Web 应用的性能对用户体验至关重要。作为最流行的服务器端脚本语言之一,PHP 在构建 Web 应用方面拥有广泛的应用。然而,PHP 应用的性能优化仍然是许多开发者关注的焦点之一。…

5 Spring 事务管理

目录 1.概述 2.事务特性:ACID 3.Spring 框架的事务管理支持两种方式 编程式事务 申明式事务 4.Spring 事务管理 API 事务管理器接口 Spring 的回滚方式 事务定义接口 事务的四种隔离级别 事务的七种传播行为 5.事务注解例子: Transactianal…

springboot+vue+mybatis警情高发智能灯箱+PPT+论文+讲解+售后

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,警情高发智能灯箱当然不能排除在外。警情高发智能灯箱是在实际应用和软件工程的开发原理之上,运用微信开发者、java语言以及SpringBo…

如何获得一个Oracle 23ai数据库(docker容器)

准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第3种: Virtual ApplianceRPM安装Docker 我已经有了一台Oracle Linux 8的虚机&#x…

python:做柱状图

import matplotlib.pyplot as plt # 数据 categories [A, B, C, D] values [23, 45, 56, 78] # 创建柱状图 plt.bar(categories, values) # 添加标题和标签 plt.title(柱状图示例) plt.xlabel(类别) plt.ylabel(数值) # 显示图形 plt.show() D:\software\新建文件夹\python\L…

力扣每日一题- 给植物浇水 II -2024.5.9

力扣题目:给植物浇水 II 题目链接: 2105.给植物浇水 II 题目描述 代码思路 根据题目内容,使用双指针从左右两边同时向中间移动,模拟浇水过程即可。 代码纯享版 class Solution {public int minimumRefill(int[] plants, int capacityA, …

java 文件表创建及前后端使用

表结构task_file 前端具体到业务表单 <el-form-item label"任务附件" prop"taskAttachment"><el-upload ref"upload" accept".jpg, .png, .txt, .xlsx, .doc, .docx, .xls, .pdf, .zip, .rar":action"upload.url" …

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

前言 上一篇文章带你实现了Go-Zero和goctl&#xff1a;解锁微服务开发的神器&#xff0c;快速上手指南&#xff0c;本文将继续深入探讨Go-Zero的强大之处&#xff0c;并介绍如何使用goctl工具实现模板定制化&#xff0c;并根据实际项目业务需求进行模板定制化实现。 通过本文…

videosapi开发微信管理系统

获取登录二维码&#xff1a; export interface Request {/*** 设备ID&#xff0c;首次登录传空&#xff0c;之后传接口返回的appId*/appId?: string;/*** 代理IP 格式&#xff1a;socks5://username:password123.2.2.2*/proxyIp?: string;/*** 地区*/regionId: string;[prop…

宋仕强论道之新质生产力

宋仕强论道之新质生产力&#xff0c;宋仕强说当前5G通信、人工智能、万物互联、工业互联网、数字经济、新能源技术和产业等领域正蓬勃发展&#xff0c;成为未来经济增长的重要推动力&#xff0c;也是目前提倡的新质生产力的重要组成部分。而这些领域的发展都离不开数据的采集、…

React使用Outlet实现路由跳转时局部刷新页面

Outlet是react-router-dom插件的一个组件&#xff0c;首先需要安装react-router-dom插件&#xff1a; cnpm i react-router-dom --save 官方文档 应该在父路由元素中用来渲染其子路由元素。这允许在渲染子路由时显示嵌套的 UI。如果父路由完全匹配&#xff0c;则将渲染子索引…

按键精灵、autojs、冰狐智能辅助到底该如何选择?

我们在做自动化脚本的过程中会遇到很多平台&#xff0c;典型的有按键精灵、autojs、冰狐智能辅助这三个是典型代表。按键精灵代表了比较早期的使用root解决方案的自动化脚本平台&#xff0c;autojs代表了使用js和无障碍功能实现的自动化脚本平台&#xff0c;冰狐智能辅助代表了…

Flutter 引入webview_windows插件,在已经使用$PATH 中的 nuget.exe情况下,windows端构建失败

报错 PS F:\xx\xxxx> flutter run -d windows Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source! Launching lib\main.dart on Windows in debug mode... E:\Some software\Visual Studio\VS 2022\MSBuild\M…