Java:什么是向上转型与向下转型(详细图解)

目录

一、什么是向上转型

1、概念

2、代码示例

3、向上转型的优缺点

二、什么是向下转型

1、向下转型的概念

​编辑

2、代码示例

三、向下转型的缺点及 instanceof 的使用

1、向下转型的缺点

2、instanceof的使用


一、什么是向上转型

1、概念

向上转型就是创建一个子类对象,将其当成父类对象来使用

语法格式:父类类型  对象名  =  new  子类类型()

                     Animal   animal  =  new Cat ();

Animal 是父类类型,但可以引用 Cat这个子类类型,因为是从小范围到大范围的转换。

2、代码示例

class Aminal {public void display() {System.out.println("Animal");}
}
class Cat extends Aminal {public void display() {System.out.println("Cat");}
}
class Dog extends Aminal {}public class Main{public static void main(String[] args) {Aminal aminal1 = new Aminal();Aminal aminal2 = new Cat();Aminal aminal3 = new Dog();aminal1.display();aminal2.display();aminal3.display();}
}

animal2中,Cat类 重写了 display方法,所以在实现时,打印的是Cat类中实现的内容。

animal3中,Dog类 没有重写 display方法,所以打印的还是父类中的内容。

由此我们可以得出:向上转型实现时

                                先看子类有没有

                                若是子类找不到

                                再看父类有没有

                                二者都无则报错!

3、向上转型的优缺点

优点:让代码实现更简单灵活

缺点:不能调用到子类特有的方法

例如:

class Animal {public void display() {System.out.println("Animal");}
}class Dog extends Animal {public void display() {System.out.println("dog");}public void eat() {System.out.println("吃骨头");}
}public class Main {public static void main(String[] args) {Animal animal = new Dog();animal.display();animal.eat(); //会报错}
}

所以,向上转型无法调用子类特有的方法!

二、什么是向下转型

1、向下转型的概念

将一个子类对象向上转型之后可以当成父类对象使用,若需要调用子类特有的方法,则需要将父类对象再还原为子类对象。这就称作向下转型。

2、代码示例

class Animal {public void display() {System.out.println("Animal");}
}class Dog extends Animal {public void display() {System.out.println("dog");}public void eat() {System.out.println("吃骨头");}
}public class Main{public static void main(String[] args) {//向上转型Animal animal = new Dog();animal.display();//向下转型//Animal类中原本没有 eat方法,在向下转型之前如果调用eat方法会报错//向下转型为子类Dog类后,就可以调用子类中特有的方法,而不会报错animal = (Dog)animal;((Dog) animal).eat();}
}

运行结果:

三、向下转型的缺点及 instanceof 的使用

1、向下转型的缺点

缺点:向下转型使用的比较少,而且不安全。如果转换失败,运行时就会抛异常。

2、instanceof的使用

Java中为了提高向下转型的安全性,引入了instanceof。如果表达式为 true,则可以安全转换。

使用实例:

class Animal {public void display() {System.out.println("Animal");}
}class Dog extends Animal {public void display() {System.out.println("dog");}public void eat() {System.out.println("吃骨头");}
}
public class Main {public static void main(String[] args) {//向上转型Animal animal = new Dog();//判断instanceof 是否为 trueif(animal instanceof Dog) {//向下转型animal = (Dog)animal;((Dog) animal).eat();} else {System.out.println("Animal无法向下转型为Dog");}}
}

 以上就是 Java:什么是向上转型与向下转型(详细图解)的全部内容了,希望能对您有所帮助!

您的点赞与收藏就是对我最大的支持!

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

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

相关文章

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务,确保高优先级任务优先执行,它内部基于优先级堆实现,保证了元素的有序性,同时,作为BlockingQueue接口的实现,它提供了线程安全的队列操作&#xff0…

人类知识的分类

根据休谟的理论,人类知识可以分为两个范畴:先验范畴和经验范畴。 先验范畴指的是那些不依赖于经验或感官观察而能够获得的知识。这些知识是基于我们的理性和思维能力而得出的,它们不需要通过直接观察或实验来验证。休谟认为,先验范…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

阅读 - 搭建博客

搭建博客的几种方式 1. 使用在线的博客系统,如语雀、掘金、CSDN等。 优点:直接创建账号使用即可,简单方便,不需要维护 缺点:文章分散在各个平台,不易于管理 2. github pages hugo、hexo等静态博客系统…

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.…

【docker 的常用命令——详细讲解】

docker 的常用命令 1. 介绍2. 基本管理命令3. 文件和数据传输4. Docker Compose 命令(用于多容器应用) 1. 介绍 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用程序及依赖包到一个可移植的容器中,然后发布到任何流…

MATLAB知识点:fibonacci函数(★☆☆☆☆)返回斐波那契数列

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第…

javaScript实现客户端直连AWS S3(亚马逊云)文件上传、断点续传、断网重传

写在前面:在做这个调研时我遇到的需求是前端直接对接亚马逊平台实现文件上传功能。上传视频文件通常十几个G、客户工作环境网络较差KB/s,且保证上传是稳定的,支持网络异常断点重试、文件断开支持二次拖入自动重传等。综合考虑使用的Aws S3的分…

01 前言

目录 什么是CC发展史C的重要性如何学习C关于本专栏 1. 什么是c C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20…

java实现多级目录树(递归实现)

一.应用场景 有时候需要我们后台给前台传树结构的数据,要怎么查询? 怎么返回数据呢? 二.数据库表设计以及数据内容(以部门举例) id 主键 parent_id 父级部门id depart_name 部门名词 sort 部门排序三.实体类 Data public…

线性判别分析(LDA)

一、说明 LDA 是一种监督降维和分类技术。其主要目的是查找最能分隔数据集中两个或多个类的特征的线性组合。LDA 的主要目标是找到一个较低维度的子空间,该子空间可以最大限度地区分不同类别,同时保留与歧视相关的信息。 LDA 是受监督的,这意…

【Linux】线程概念和线程控制

线程概念 一、理解线程1. Linux中的线程2. 重新定义线程和进程3. 进程地址空间之页表4. 线程和进程切换5. 线程的优点6. 线程的缺点7. 线程异常8. 线程用途9. 线程和进程 二、线程控制1. pthread 线程库(1)pthread_create()(2)pth…

哈夫曼树的学习以及实践

哈夫曼树 哈夫曼树的基本了解哈夫曼树的基本概念创建霍夫曼树的思路编码构建的思路代码实现创建HuffmanTree结点初始化HuffmanTree创建霍夫曼树霍夫曼树编码 哈夫曼树的基本了解 给定 n 个 权值 作为 n 个 叶子节点,构造一颗二叉树,若该树的 带权路径长…

UDP报文结构和注意事项

udp由报头和载荷组成,报头由四部分组成 源端口 目的端口 udp长度 检验和,每部分由两个字节组成。 源端口和目的端口分别表示发送方和接收方的位置 udp长度表示了该数据报的大小,一个udp数据报为64kb 检验和用来检验所得到的数据是否正确。…

LeetCode:83和82.删除排序链表中的重复元素I,II

这两题算是链表的基础题,就遍历删除没啥特点, 83甚至不需要考虑第一个结点的特殊情况,属实是名副其实的easy了 LeetCode:21.合并两个有序链表之第一次的特殊情况-CSDN博客 83. 删除排序链表中的重复元素 - 力扣(Lee…

TeamCity创建git项目Timed out 超时的一个解决办法

问题: 当自己: ping github.com从本地推送到远程仓库浏览器浏览www.github.com ——都没有问题 但是在teamcity创建工程的时候就超时: 或者多试几次,终于成功了,然后构建的时候半途超时报错。。。。。 一种解决办…

Vue3快速上手(四)ref之基本类型响应式数据

一、ref之基本类型响应式数据 1.1 基本语法 import { ref } from vuelet x ref(初始值)console.log(xxx --> , x.value);x为一个RefImpl对象,该对象的value属性为实际值,在script里需要操作x.value来改变数据的值,在页面里则可以直接使…

Django学习全纪录:创建第一个Django项目,如何使用Django开发⼀个web应用

导言 在上一篇文章里,我们对Django的开发环境进行了学习以及搭建,在上一篇文章里,同时也为大家介绍了安装、验证、修改默认镜像源等知识。 在这一篇文章里,我们就正式开始我们的Django开发之旅,创建我们的第一个项目,做一些较为简单且必需的前置工作。 如何创建Django项目…

【MySQL】学习约束和使用图形化界面创建表

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

RocksDB:高性能键值存储引擎初探

在现代的分布式系统和大数据应用中,一个高效、可靠的存储引擎是不可或缺的。RocksDB,由Facebook于2012年开发并随后开源,正是为了满足这类需求而诞生的。它是一个持久化的键值存储系统,特别适合在闪存(Flash&#xff0…