JAVA中的向上转型和向下转型

2023-05-16

一、向上转型和向下转型

       向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点:

             1.这是继承过程中发生的操作

             2.新类是现有类的一种类型。这种说法主要是因为现有类的方法必定存在于新类中,所以通过现有类发送的信息(就是通过创建一个对象进行操作)可以直接通过新类发送。

 二、向上转型

        向上转型:创建一个基类的引用,但是在创建对象的时候是用的导出类的。示意图如下:

                                

         由图可知:由导出类转型成基类,在继承图上是向上移动的。同时由于是从较专用类型向较通用类型转换,所以是安全的,因为专用类型肯定包含通用类型。

         特点:

            1.把导出类对象直接赋给基类类引用,不用强制转换

            2.引用可以直接使用基类中的方法,但是不能使用导出类的方法

            3.从导出类向上转型,永远不需要知道正在处理的对象的确切类型

            4.在向上转型过程中可能发生类接口中方法丢失

        示例 :

class Fupcasting{
	public Fupcasting(String ident) {
		System.out.println("i am " + ident);
	}
	public void count() {
		
	}
}
public class Upcasting extends Fupcasting{
	public Upcasting(String ident) {
		super(ident);
		// TODO Auto-generated constructor stub
	}
	public void add() {}
	public static void main(String[] args) {
		String  name = "fatherupcasting";
		// TODO Auto-generated method stub
		Fupcasting fupcasting = new Upcasting(name);    //向上转型
		fupcasting.count();
		//fupcasting.add();   //使用导出类的方法报错
	}

}

 三、向下转型

        向下转型可以参照向上转型,二者正好相反。这里使用向下转型的原因是因为上述的向上转型的第三条的关系:从导出类向上转型,永远不需要知道正在处理的对象的确切类型!

        解释如下:

可知:导出类可以完全代替基类,在使用它们的时候,完全不需要知道关于子类的任何信息。

这里如果你清楚  引用对象  的概念,你就会明白,当我们在向上转型的时候,你处理的导出类的对象你完全不清楚确切类型,这里的类型可以是 基类,也可以是导出类,也就是这一步:

Fupcasting fupcasting = new Upcasting(name);  

你也可以写成这样:

Fupcasting fupcasting = (Fupcasting)new Upcasting(name);    

或者这样:

Fupcasting fupcasting = (Upcasting)new Upcasting(name);    

这里的   (Upcasting)  和 (Fupcasting)  都声明了我们创建的对象的类型,但是在向上转型的过程中我们是这样做的:

Fupcasting fupcasting = new Upcasting(name);  

通过上面的步骤我们知道我们并不清楚这个对象是什么类型的,所以如果在一定的情况下要获取类型信息,就会用到向下转型!

向下转型示意图:

借用上面的shape图,如果现在我们知道有一个几何图形,但是我们不清楚它是圆、正方形等,但是它的形状肯定是唯一确定的。

实例:

class Fupcasting{
	public Fupcasting(String ident) {
		System.out.println("i am " + ident);
	}
	public void count() {
		
	}
}
public class Upcasting extends Fupcasting{
	public Upcasting(String ident) {
		super(ident);
		// TODO Auto-generated constructor stub
	}
	public void add() {}
	public static void main(String[] args) {
		String  name = "fatherupcasting";
		// TODO Auto-generated method stub
	//	Fupcasting fupcasting = (Upcasting)new Upcasting(name);    //向上转型
	//	fupcasting.count();
		//fupcasting.add();   //使用导出类的方法报错
		 Upcasting upcasting = (Upcasting) new Fupcasting(name);   //向下转型
		 upcasting.add();
	}

}

特点:

   1.向下转型可以调用子类类型中所有的成员

   2.父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,就是编译是不会出错误。但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会             出现 Java 强制类型转换异常

 

如果觉得对你有帮助,点个赞再走吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中的向上转型和向下转型 的相关文章

随机推荐

  • OpenStack版本 - 发布时间 - 及其组件

    Austin xff08 2010 10 xff09 xff1a Nova Glance Keystone Horizon Swift QuantumBexar xff08 2011 02 xff09 xff1a Nova Glance K
  • 总结:数据清洗的一些总结

    前言 在整理项目的时候发现清洗过程是一个非常细节的过程 xff0c 几乎贯穿始终 xff0c 也是后续步骤特征提取等的前置条件 xff0c 所以整理如下 因为展开较大 xff0c 所以我已近上传mindnode脑图和原始照片尺寸 xff0c
  • Ubuntu18.04+Melodic+UR5

    文章目录 配置与使用文件内容ur gazebo ur5 ROS Gazebo pickup 配置与使用 https github com ros industrial universal robot有详细说明 用Gazebo roslaun
  • cuda10.0 安装torch1.7.1

    pip install torch1 7 1 43 cu92 torchvision0 8 2 43 cu92 torchaudio 61 61 0 7 2 f https download pytorch org whl torch st
  • 对抗训练

    文章目录 1 定义2 对抗训练 xff1a 从CV到NLP2 1 CV中的数据格式2 2 NLP中数据格式 xff13 对抗样本与数据增强样本 xff14 如何确定微小扰动 xff14 1 Fast Gradient Sign Method
  • 38、带参数的装饰器

    一 带参数的装饰器 我们看 xff0c 装饰器其实就是一个闭包函数 xff0c 再说简单点就是两层的函数 那么是函数 xff0c 就应该具有函数传参功能 login status 61 39 username 39 None 39 stat
  • Git系列:windows10安装Git版本控制工具!

    Git系列 xff1a windows10安装Git版本控制工具 xff01 前言 今天博主将为大家分享Git系列 xff1a windows10安装Git版本控制工具 xff01 不喜勿喷 xff0c 如有异议欢迎讨论 xff01 开始安
  • VNC 连接腾讯云服务器(解决黑屏、灰屏问题)

    整了一天 xff0c 要么黑屏 xff0c 要么灰屏 xff0c 巴拉巴拉 xff0c 最后终于好了 vnc xstartup修改为如下 随后chmod 777 vnc xstartup 就可以了 教程视屏 xff1a https clou
  • 【云计算学习笔记(二十一)】之Neutron子服务详细介绍

    文章目录 本文章由公号 开发小鸽 发布 xff01 欢迎关注 xff01 xff01 xff01 一 xff0e Neutron xff08 一 xff09 Neutron介绍 xff08 二 xff09 Neutron功能1 二层交换Sw
  • 51单片机、DS18B20、智能窗帘控制系统

    写在最前面 xff1a 文章是我的设计报告搬运过来的 xff0c 嫌排版乱的 xff0c 可以直接下载设计报告 xff0c 包含word xff0c keil工程 xff0c proteus工程 xff01 xff01 xff01 xff0
  • 手写RTOS-PendSV中断

    今天这一篇 xff0c 我们说一下操作系统都要用到的PendSV中断 xff0c 整个操作系统中 xff0c 要自己写的的汇编代码不超过20行 xff0c 全部都在PendSV中断里 以下是 Cotex M3权威指南 里对PendSV的描述
  • 如何知道可执行文件是32-bit还是64-bit

    可以使用GetBinaryType API来获得这个信息 xff1a BOOL GetBinaryType LPCTSTR lpApplicationName LPDWORD lpBinaryType Binary Type可以是下面的值
  • 手写RTOS-使用PendSV进行压栈与出栈操作

    学会使用PendSV中断进行压栈和出栈操作 xff0c 是实现任务调度的关键 今天我们就来学习一下如何使用不超过20行的汇编实现压栈和出栈操作 我们现在来实现这么一个例子 xff1a 先把R4 R11通用寄存器的值保存到一个缓冲区里面 xf
  • 树莓派 Ubuntu mate 16.04 下开启vncserver完整教程

    关于开启vncserver的教程 xff0c 在树莓派上不桶系统上 xff0c 有很多教程 xff0c 杂七杂八 这里的环境是 xff1a 树莓派3b 43 Ubuntu 16 04 mate 一 xff1a 在树莓派下完成以下任务 1 安
  • 在linux上安装oracle数据库并通过远程映射建库

    前期准备 安装虚拟机 xff1a 我这里用的VM15 5 xff0c 可用虚拟机有CentOS以及红帽系列版本下载oracle数据库的安装包以及 rpm补丁包 xff0c 并传入linux虚拟机 xff1a 在虚拟机安装VMTools以共享
  • VMware虚拟机Ubuntu无法连接网络的解决办法

    原文来源 1 Ubuntu网络设置 xff1a 依次单击 System Settings gt Network gt Wired gt Options xff0c 如下图所示 xff1a 依次选择 General xff0c 勾选如下图所示
  • Meta-Learning之How to train your MAML

    这篇文章是MAML的升级版本 xff0c 即MAML 43 43 他针对MAML的一些不足之处做了对应的改进 xff0c 如稳定性 收敛速度 表现力等均得到提升 由于自己的算法实现中有用到MAML xff0c 为了让整体算法有一个好的性能
  • 对于中断的笔记

    我们首先要区分内核与外设 内核是为众多应用程序提供对硬件的安全访问的软件芯片 xff0c 如Cortex M4 xff0c 是ARM公司开发的 外设是ST公司在拿到这个内核后 xff0c 制作了相应的硬件 xff0c 如GPIO RTC以及
  • 正则表达式中?=和?:和?!的理解

    要理解 61 和 xff0c 首先需要理解前瞻 xff0c 后顾 xff0c 负前瞻 xff0c 负后顾四个概念 xff1a 前瞻 xff1a exp1 61 exp2 exp1后边是exp2就匹配 后顾 xff1a lt 61 exp2
  • JAVA中的向上转型和向下转型

    一 向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西 xff0c 在讲到转型之前我们需要认识到继承过程中的对象类型转换 xff0c 这种转换有两个特点 xff1a 1 这是继承过程中发生的操作 2 新类是现有类的一种类