父类与子类的上下类型转换

news2024/11/17 17:52:31

文章目录

  • 前言
  • 一、上下类型转换是什么?
  • 二、使用方法
    • 1.父类与子类的转换
    • 2.instanceof关键字
  • 总结

前言

        动物有共性的行为,例如吃。狗属于动物中的一类,对于“吃"这种行为,又有自己独特的见解,“吃狗粮”。当我们把“狗”上升到“动物”的概念,“狗”可以使用“动物”中的“吃”的行为,尽管在实践中,狗仍是进行“吃狗粮”的行为,在java中属于子类的向上转型;当我们把“动物”下沉到“狗”的概念,“动物”可以使用“狗”中的“吃狗粮”的行为,但前提是这个动物被认定为狗,毕竟不是所有动物都吃狗粮,在java中属于父类的向下转型。

一、上下类型转换是什么?


        向上转型:通过 new 关键字创建子类对象,赋值给 父类的引用变量,实现子类的向上转型

Parents a = new Child();
/*    Child类继承了Parents类
*     new关键字,创建了Child类的对象
*     赋值给了Parents类的引用变量 a
*     实现了 Child()对象的向上转型
*/

        向下转型:通过 new 关键字创建父类对象,强制转换,赋值给子类,实现父类的向下转型

Parents b = new Child();
/* new 关键字,创建了Child类的对象
*  赋值给了Parents中的引用变量 b
*  相当于创建了Parents对象
*  并且点明了Parents类和Child类的关系,Parents对象实际上为Child类的一个实例
*  进行强制转换时不会报错
*/
Child c = (Child)b;
/* 将引用变量 b 强制转换成 Child类的引用变量 c    
*  实现了Parents对象的向下转型
*/

         注意:

              1.父类与子类的上下类型转换,两个类之间,必须通过extends关键字,有继承关系

              2.向下转型时,父类不能直接通过 new 实例化 赋值给子类的引用变量,必须进行子类           的强制转换。举个例子,向上转型,我们可以把“鸭脖”上升到“食物”这一层次;向下转型,           我们不能直接将“食物”下降到“鸭脖”这一层次,因为食物是广泛的,你怎么知道它是鸭脖,           不是老鼠头呢?所以向下转型时,我们还要多一句“这就是鸭脖”,鸭脖 c =(鸭脖)b;

               3.向下转型时,Parents b = new Child(); 乍一看,这不是向上转型吗?是的,子类对象实例化,赋值给了父类,相当于创建了父类对象 b。向下转型时,少了这句话,就没有明确 b 实际上是子类的一个实例化对象,强制转换时,Child c =(Child)b;  会报错,不能强制转换

                4.无论是创建父类子类对象,还是进行上下类型转换的代码,都要在方法中才能用

                5.即使向上转型,转型为父类,调用父类方法,若被子类覆写过,仍然调用的是子类覆写过后的方法 ,因为本质上是子类实例化对象,赋值给了父类,归根到底还是子类对象 

二、使用方法

1.父类与子类的转换

        (1)创建父类 Food类,创建 nutrition()方法,num属性

package projectMy;

public class Food {
	void nutrition(){
		System.out.println("营养成分:糖类,蛋白质,脂肪,无机盐,维生素,水");
	}
	
	int num = 1;
}

        (2)创建子类  DuckNeck类,覆写 nutrition()方法,创建 shape()方法

package projectMy;

public class DuckNeck extends Food{
	void nutrition() {
		System.out.println("营养成分:蛋白质,无机盐,脂肪,水");
	}
	
	void shape() {
		System.out.println("形状:长条脖子");
	}
}

        (3) 创建Demo类,进行类的上下类型转换 

                one.向上转型

package projectMy;

public class Demo {
	public static void main(String[] args) {
		Food food1 = new DuckNeck();
        //子类对象实例化,赋值给了父类,实现向上转型
		food1.nutrition();
        //调用父类方法,覆写过即为子类方法
        System.out.println("food1.num");
        //调用父类的属性
	}
}

                 输出结果:

         问:输出结果是鸭脖的营养元素,不是父类中的营养元素,有没有发现,即使子类不进行向上转型,子类继承着父类。照样可以实现输出结果中的内容?

         答:向上转型的意义在于多态性,模块化,这种方法允许我们编写更多可以处理的泛型代码,多种类型的对象,而不必为每个对象编写单独的代码。

                two.向下转型

package projectMy;

public class Demo {
	public static void main(String[] args) {
	
		Food food2 = new DuckNeck();
		DuckNeck duckNeck = (DuckNeck) food2;
		duckNeck.shape();
		duckNeck.nutrition();
		System.out.println(food2.num);
	}
}

                 输出结果: 

            该传串代码,创建父类对象 food2,强制向下转型为子类 duckNeck对象,可以调用子类独有的shape()方法,覆写的方法,父类原本的属性。

            向下类型转换,可以用于生成初始化的对象,用户自定义选择,例如生成一个食物,用户可以根据自己的需要选择,将这个食物具体为面包,鸭脖等等,这时通过 向下类型转换 即可实现。

2.instanceof关键字

        instanceof关键字:判断父类与子类之间的继承关系是否正确

        语法:   子类对象名 instanceof 父类类名/接口名称

        实操展示:

boolean result = child instanceof Parents;
System.out.println(child instanceof Parents);
/* child 为子类对象   Parents 为类名
*  child 对象 是否为父类的继承对象
*  结果为布尔值,赋值到 result 对象
*/

         输出结果:true

         注意: 

                1.instanceof关键字,只能在类与类是父类子类的继承关系时使用。类和类之间没有继承关系时,  用instanceof判断,会报错。

                2.如果是子类的父类的父类,判断子类是否继承父类的父类,可以使用instanceof关键字,返回 ture 值。

                假设 B类 继承 A类,C类 继承 B类

C c = new C();
system.out.println(c instanceof A);

                输出结果: true

                3. 可以理解为,instanceof关键字,判断父类和子类的关系是否颠倒,没有,返回true值;关系颠倒,返回false值。


总结

        以上就是父类与子类的上下类型转换,和instanceof关键字。如果对文章中“接口”概念不太熟悉,可以看up主空间的下一篇文章。

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

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

相关文章

STM32--基于固件库(Library Faction)的流水灯、静态数码管

目录 一、GPIO介绍 二、基于固件库(Library Faction)的流水灯 三、基于固件库(Library Faction)的静态数码管 一、GPIO介绍 GPIO库函数,对GPIO可进行一些,读写控制的操作,本文章应用的就是…

短视频矩阵是什么?源码搭建技术干货

一、短视频账号矩阵是什么? 短视频账户矩阵实际上是通过一些技术手段将账户和账户连接起来的。这种账户有一定的相关性。通过相互吸引流量,可以扩大账户的影响力,使账户拥有更多的粉丝和更高的价值。短视频账户矩阵属于短视频营销策划的高级…

Python 带你制作自动评论程序,让你喜欢的人一眼看到你

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 知识点: 动态数据抓包 requests发送请求 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests pip install requests 第三方模块安装: win R 输入cmd 输入安装命令 pip install 模块名 (…

深入了解CSS颜色架构:提升你的网页设计技巧

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的,我们出的钱 体验地…

【Java】JUC下的常用接口和类

Callable接口ReentrantLock常用的方法创建公平锁创建读写锁唤醒机制ReentrantLock与synchronized的区别 原子类工具类SemaphoreCountDownLatchCyclicBarrier-循环栅栏 线程安全的集合类CopyOnWriteArrayList多线程环境使用队列多线程环境使用哈希表ConcurrentHashMap java.util…

OpenResty 中的 Nginx 基础知识

Nginx 版本 OpenResty 的版本,落后于标准 Nginx 版本不少,所以较新的 Nginx 支持的功能,OpenResty 不一定支持。 Nginx 进程模型 当启动 Nginx 后我们使用 ps 来查看相关进程: $ ps -ef --forest | grep nginx root 32475…

OpenGL超级第12章学习笔记:管线监控

前言 本篇在讲什么 OpenGL蓝宝书第十二章学习笔记之管线监控 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c…

C++编译过程

How the C Compiler works? 文章目录 How the C Compiler works?compilingExamples总结欢迎关注公众号【三戒纪元】 通过编程,是的text程序编程可执行文件,基本上主要有2个操作发生: compiling 编译linking 链接 compiling C 编辑器要做的…

VXLAN:数据中心网络的未来

概要 随着云计算和虚拟化技术的快速发展,数据中心网络正面临着越来越大的挑战。传统的网络架构在适应大规模数据中心的需求方面存在一些限制,如扩展性、隔离性和灵活性等方面。为了克服这些限制,并为数据中心网络提供更好的性能和可扩展性&am…

【好书精读】网络是怎样连接的 之 连接服务器

(该图由AI制作 学习AI绘图 联系我) 目录 1 连接是什么意思 1.1 连接实际上是通信双方交换控制信息 2 负责保存控制信息的头部 2.1 客户端与服务器之间交换的控制信息 连接操作的实际过程 1 连接是什么意思 创建套接字之后 , 应用程序 …

Selenium教程__使用execute_script执行JavaScript(11)

selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的innerHTML方法就能够很快的完成输入。 selenium执行…

Shell 函数实现Go语言多版本管理轻量级方案

现有的工具方案 https://github.com/moovweb/gvmhttps://github.com/voidint/g 我的方案 优点: 原生:基于 go 语言本身支持多版本的能力实现,可以下载任何官方发布的版本简单:shell 函数实现,直接集成到 bashrc 或…

软件测试技能,JMeter压力测试教程,HTTP Cookie管理器(四)

目录 前言 一、场景案例 二、HTTP Cookie管理器 三、302 重定向 前言 Web网站的请求大部分都有cookies,jmeter的HTTP Cookie管理器可以很好的管理cookies 我用的 jmeter5.1 版本,直接加一个HTTP Cookie管理器放到请求的最前面,就可以自…

用docker搭建selenium grid分布式环境实践

目录 前言: selenium jar包直接启动节点 用docker命令直接启动 docker-compose 启动 Hub和node在一台机器上 Hub和node不在一台机器上 遗留问题 总结 前言: Selenium是一个流行的自动化测试工具,支持多种编程语言和多种浏览器。Sele…

【微服务架构演进】一文读懂单片到微服务架构的模式和最佳实践

在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百…

学习Spring之声明式事务

什么是事务? 一个业务有一组操作,要么都成功,要么都失败 事务的四大特性:ACID A 原子性:一组操作,要么都成功,要么都失败 C 一致性 :事务的前后要保证事务的一致性 I 隔离性 &…

QLabel的使用

QLabel介绍 QLabel 是 Qt 框架中的一个控件类,用于显示文本或图像。它可以在窗口或其他容器中显示静态文本,并且可以根据需要设置格式、对齐方式和尺寸。 主要作用如下: 显示文本内容:QLabel 可以显示文字内容,可以…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Spring Boot 中使用 @EventListener 注解监听事件

Spring Boot 中使用 EventListener 注解监听事件 Spring Boot 是一个流行的 Java Web 框架,它提供了丰富的功能和工具来简化开发人员的工作。其中一个非常有用的功能是事件监听器。在 Spring Boot 中,我们可以使用 EventListener 注解来监听事件&#x…

一天时间完成Python入坑(开发环境搭建、excel解析、exe打包三步走)

0.为什么要入坑Python 早就知道Python好,Python妙,Python用起来呱呱叫。工作上一直没有什么用得上Python的必要性,就一直没有接触,本次终于来了机会:【图新地球桌面端要对外开放Python API】,开放图新地球的…