Java基础:第四十讲 向上转型和强制类型转换

中国 it 集成商 主要有哪些 主要做什么工作 既要懂技术(云计算/AI),又要吃透行业(金融/政务)。:用国产化方案(麒麟OS+达梦数据库)替换Oracle/Windows。:如为银行搭建数据中心(采购华为服务器+思科交换机)。:数据中心监控、故障处理(如华胜天成服务国家电网)。:核心交易系统(如中科软为保险公司开发精算平台)。:智慧城市(如太极股份承建“一网通办”政务平台)。:HIS医院信息系统(如东华软件的电子病历系统)。:硬件透明化(如服务器价格战)压缩集成毛利。:工厂设备联网(新华三的工业互联网平台)。 阅读详情

有时候需要把父类对象指向子类对象,有时候需要把父类对象转换成子类对象。例如我们可以说某一只狗是一只动物,还可以说这只动物是一条狗,但前提是我们要知道狗肯定是动物,而那只动物必须是一只狗。下面介绍如何把父类指向子类对象,如何把子类对喜爱那个强制转换成子类对象。

1、父类引用指向子类对象

正常情况下,我们会定义某个类的对象引用,然后使用new实例化一个对象,然后把这个引用指向该实例。例如:

Dog dog =  new Dog();

假设Dog是Animal的子类,也可以写下面的代码:

Animal animal = new Dog();

Animal animal定义了一个Animal对象引用,new Dog()实例化了一只狗,然后animal指向了这只狗。 这是允许的,就像我们指着一只狗,然后说它是动物,它确实是动物。

还可以写成下面的形式:

Animal animal = dog;

意思是把animal引用指向dog引用指向的实例。

这就是向上转型,不仅仅是父类可以指向子类的对象,只要是祖先类都可以指向子类的实例。典型情况,Object是所有类的祖先类,所以Object类型的对象引用可以指向任何对象。例如下面的代码:

Object o = new Dog();

把父类引用指向子类对象的好处是什么呢?自己可以思考一下,后面的多态性应用中详细介绍。

另外,类似的用法还有:

某个方法的定义如下:

public void setValue(Object o){

   this.value = o;

}

这个方法的参数是Object类型,返回值类型是Object。因为参数类型是Object,所以在调用这个方法的时候我们可以给它传递任何类型的参数,包括上面的Dog对象,只要是它的子孙类就可以了。

再看下面的方法:

public Object getValue(){

   return value;

}

value可以是任何类型,Dog实例,Animal实例,Date实例,Person实例都可以。

想想数据结构中的链表、队列等等,他们的元素可以是各种类型,就可以使用这种方式,可以设置整数链表、Dog链表,获取它的元素的时候,返回值的类型由元素类型决定,所以参数和返回值类型都应该设置为Object。

总结一句话:任何需要父类对象地方都可以给子类对象。

2、强制类型转换

我们可以把父类引用指向子类对象,但是这样带来的其他问题。假设Dog有一个特殊的行为方法f,如果把Dog实例赋值给了Animal引用,例如下面的代码:

Animal animal = new Dog();

如何访问Dog的f方法呢?

直接写animal.f()肯定不行,编译不能通过,因为animal没有方法f()。

所以这时候还需要把animal再转换成Dog才可以访问方法f。能这样写吗?

Dog d = animal;

不能,变异的时候就会报错类型不匹配。可以使用下面的代码:

Dog d = (Dog)animal;

强制把animal转换成了Dog,也就是把动物转换成了狗。这就是强制类型转换,把父类对象转换成子类对象(子类对象引用指向了父类对象)。

能转换吗?因为我们知道这只动物确实是狗,所以可以转换。

再看下面的代码:

Animal animal = new Cat();

Dog d = (Dog)animal;

单从第2行看,与之前的代码没有区别。但是大家一看就知道有问题,因为代码想把猫转换成狗,这时候会报错的:ClassCastException

这种错误不是语法错误,所以能够编译通过,但是在运行的时候出错。

所以在进行强类型转换的时候,我们要确保能够转换,只有当父类指向的实例是某个子类的对象的时候才可以转换成该类的对象。

如果不能确定可以通过instanceof操作符进行判断。

if(animal instanceof Dog)

    Dog d = (Dog)animal;

李绪成 优快云 Blog: http://blog.youkuaiyun.com/javaeeteacher
机器人中的数值优化(一)—— 数学优化、凸集合与凸函数 本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例。 阅读详情

相关推荐

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

父类与子类的转换

1.子类的对象可以被其视为父类的一个对象 Student s=new Student(); Person p=s; 相当于子类可以赋给父类 2.父类对象不能被当作是其某个子类对象 Person p=new Person(); Student s=p; //错误 3.只有父类对象指向子类,那么父类是可以强制转换成子类,如果父类对象没有指向子类,那么强制转换就会报错的 Person p=new Person(); Student s=new Student(); s=(stud.

summer的博客 7245

瑞芯微rv1126 rtsp+mpp+rga取流

瑞芯微rv1109 rtsp+mpp+rga取流

ZuoSeDiao的博客 6340

Java面向对象程序设计 - 清览云题库

广州商学院的Java作业答案

FangWenJing150的博客 1万+

华强北手表256G真相大揭秘:ADB命令实测内存与存储(附完整调试教程)

本文通过ADB命令实战揭秘华强北智能手表256G存储等硬件参数的真实性。文章提供了从开启调试模式到使用ADB命令查询系统属性、验证内存与存储容量的完整教程,帮助用户识别参数虚标,评估设备真实性能与潜在风险。

e3f4g5的博客 1239

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1085

Java对象类型转换:向上转型和向下转型

public String name = "Animal:动物";public static String staticName = "Animal:可爱的动物";System.out.println("Animal:吃饭");System.out.println("Animal:动物在吃饭");public String name = "Cat:猫";public String str = "Cat:可爱的小猫";

weixin_62458944的博客 1208

功率开关管驱动串扰(Crosstalk):深度解析与优化方案

介绍了功率开关器件驱动串扰产生机理,并整理了常见的工程应用优化措施

qq_38326420的博客 561

向上类型强制转换和向下类型强制转换

编程中可能遇到父对象与子对象相互转换的问题: (一)向上类型转换(upcasting): 使用只向父类的指针或引用来避免切割问题。 Parent &myParent = myChild; (二)向下类型转换(downcasting): 利用dynamic_cast 。 Child *myChild = dynamic_cast (myParent); if (myChild != N

那个谁上山的专栏 695

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3447

WPF实现圆形菜单动态展开折叠效果

实现效果如下: 思路:根据子菜单个数计算旋转角度动态生成子菜单,并设置展开折叠动画。 步骤: 1、自定义按钮MyButton,建立展示图像属性DisplayImage public class MyButton : Button { public static readonly DependencyProperty DisplayImageProperty = DependencyProperty.Register("DisplayImage", typeof(

dnazhd的博客 3152

向上强制类型转换(Object slicing)

// CObject.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include class CObject { public: virtual void Serialize(){ std::cout<<"CObject::Serialize()\n\n"; } protected: private: }; class CDocumen

zhuimengzh的专栏 1864

ORB-SLAM2算法部署验证、原理代码和各种改进方法汇总

本文主要汇总个人学习使用ORB-SLAM2算法中参考的相关博客和代码汇总,以及在ORB-SLAM2算法基础上各个改进方法的汇总。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 745

【基础知识】向上转型和向下转型

一、向上转型 好处:隐藏了子类型,提高了代码的扩展性。 坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。 二、向下转型 好处:可以使用子类型的特有功能 坏处:面对具体的子类型,向下转型具有风险。即容易发生ClassCastException,只要转换类型和对象不匹配就会发生。解决方法:使用关键字instanceof。 ......

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 7546

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 向上转型 向下转型 强制类型转换

有关向上造型和向下造型的核心精髓就是一句话:在创建实例的时候到底是子类的实例还是父类的实例。如果是子类的实例,则就完全可以进行强制类型转换。 向上造型 父类的引用指向子类的对象。实例化成子类,可用方法使父类中的方法,方法体实现是子类中的方法(体现了多态)。实例化成谁就会用到谁的方法体。 public class People{ public void print(){ System....

weixin_38621547的博客 4198

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java向上向下转型那些事

在学习Java编程中,最头疼事情之一就是数据类型转换。有时候它在不经意之间就完成了(自动类型转换),有时候却又要求我们手动指定(强制类型转换)。基本数据类型,转换规则还可以通过类型本身空间大小和精度分析明白,而且最多就是丢失精度,运行起来至少是不会报错。可是面对引用数据类型,这个“坑”就大了:有自动转的,有强制转的,还有强制都转不了的;自动转了的却把对象身上的方法丢了看不见;强制转的编译过了运行却可能报异常。 笔者也是花了好久才勉强弄懂,分享本文帮助读者理解 一、转型(casting): 首先我们来了解转型

DavidGarrett的博客 2431

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java类型转换——向上转型,向下转型

我们通常把将一个类型强制转换为另外一个类型的过程称之为,本文所提到的对象类型转换,,因为在Java中不存在继承关系的对象进行转换的时候会抛出java强制类型转换异常。

秋名山码民的技术小屋 8512

java的向上转型

在java中,一个类可以继承另一个类,被继承的类叫做父类(超类),继承的类叫做子类。子类的创建过程中,会先对父类部分进行初始化(先创建一个父类对象),再对子类部分初始化,并且子类会继承父类所有的属性与方法(包括private,但是无法直接访问),同时子类可以对父类方法进行覆盖(详细见。在Cat的构造函数中,我们调用了其父类Animal的构造函数,并传入age参数。由于Cat继承自Animal类,所以Cat的方法eat重写了父类的eat,故输出“猫在吃鱼”。需要注意的是,在进行向上转型时,

m0_74131274的博客 5243

装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向)

装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向) 文章目录装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向)问题原型:1 装箱和拆箱2 强制类型转换和向上自动转型3 多态总结 问题原型: 装箱和拆箱是为了简化基本数据类型的包装类之间的运算而设计的特性吗?强制类型转换和向上自动转型是什么?上述问题之间有什么关系吗? 1 装箱和拆箱 装箱是...

adhero的博客 1250

java类型转换(向上转型和向下转型)

java对象转型(向上转型和向下转型)向下转型和向上转型是什么意思向上转型和向下转型的基本公式: 向下转型和向上转型是什么意思 基本数据类型,转换可以通过隐性和显性(强制)类型转换,例如float类型转成int类型,把double类型转成float类型。 对象类转型的话,就需要用到向上转型或向下转型,为了区分到子父类对于方法的调用。 向上转型和向下转型的基本公式: 向上转型: Father f = new Son(); Father是父类或接口,son是子类。 //直接转换,加不加括号强转都无所谓 向下

bingo39的博客 2206

Java 基础系列(十) --- 什么是向上转型和向下转型

向上转型与向下转型

Fug_Lee的博客 8422

Java·向上转型和向下转型

向上转型是“简化身份”,自动、安全,用于多态场景”(比如用父类作为方法参数,接收任意子类对象);向下转型是“还原身份”,强制、不安全,必须用instanceof判断后再转,用于需要使用子类特有功能的场景”;“向上转型依赖 “is a” 关系,向下转型依赖 “实际对象类型匹配”。用一句话记住:向上转不用强转,只能用父类的活;向下转必须强转,先判断再干活。t=P9T8。

Porunarufu的博客 851

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

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方法必定存在于新类中,所以通过现有类发送的信息(就是通过创建一个对象进行操作)可以直接通过新类发送。 二、向上转型 向上转型:创建一个基类的引用,但是在创建对象的时候是用的导出类的。...

Mr_yuntuo的博客 6971

【Java】向上转型和向下转型

在Java中,向上转型是安全的,因为子类对象是父类类型的一个特例。在Java中,我们不能直接将一个父类对象强制转换为子类对象,除非这个父类对象实际上是子类对象的向上转型。但是需要注意的是,如果子类中的某些属性或者方法时 private 的,那么即使进行了向下转型,也无法直接访问这些 private 成员。向下转型(Downcasting)是Java中类型转换的一种,它指的是将一个父类对象转换为子类类型的全过程。如果一个方法返回一个子类对象,但是方法的返回类型是父类,那么在返回时也会发生向上转型。

Yeeear的博客 2149

Java中强制类型转换的原理

图中的过程:把animal原来存的Animal实例变量的地址,但是向上转型后,只是把animal的存的地址改成了Dog实例变量的地址。刷面经的时候,刷到了向下转换,发现自己还是不懂Java中强制转换的原理,特此记录。图中发生的过程其实也是栈中保存的地址的转换,与向上转型没什么区别。区别在于 向下转型有一个强转符号,这个强转符号的作用就是。此时栈中的引用型变量存的是堆中的地址。指向的对象的实际类型是否是。在运行时,JVM 会检查。double 是64位。为什么向上转型是安全的。

qq_63255075的博客 1856

java向上转型和向下转型

我们知道,java这个狗一样的东西的三大特性:继承,封装,多态。 然后继承和多态带来的一个比较拗口的问题就是,对象转型问题,我们今天就来扯一下。 首先,规定一下转型的概念,我套用一下黄小斜大神在github上的说法,转型,指的是等号左侧引用类型的改变。 但是此时,有一个概念需要给大家普及一下,我猜测可能很多宝宝们都有这个疑惑,那就是引用(对象的引用)和对象是一个东东吗? 先说结论:引用是引...

an20150509的博客 1244
上一篇: Java基础:第三十九讲 多态
下一篇: Java基础:第四十一讲 this和super
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值