Java异常ClassCastException的解决
作者:街头卖艺的肖邦 发布时间:2022-10-21 02:37:13
在说ClassCastException之前,先介绍下引用类型转换;
引用类型转换分为向上转型和向下转型两种;
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的;当父类引用指向一个子类对象时,便是向上转换;
使用格式:
父类类型 变量名 = new 子类类型();
向下转型:父类类型向子类类型向下转换的过程,这个过程时强制;一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制转换的格式,便是向下转换;
使用格式:
子类类型 变量名 = (子类类型) 父类变量名;
转型的目的:
当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译错误,即父类不能调用子类拥有的,而父类没有的方法;编译都错误,更别说运行,要想调用子类特有的方法,必须做向下转型;
转型示例代码:
定义类:
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void watchHouse() {
System.out.println("看家");
}
}
测试类:
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
// 调用的是 Cat 的 eat
a.eat();
// 向下转型
Cat c = (Cat)a;
// 调用的是 Cat 的 catchMouse
c.catchMouse();
// 向下转型
Dog d = (Dog)a;
// ClassCastException异常
d.watchHouse();
}
}
上面这段代码可以编译,但在运行时,会报ClassCastException异常;
ClassCastException: 当试图将对象强制转换为不是实例的子类时,抛出该异常;
上面的测试类中创建了Cat类型对象,运行时不能转换成Dog对象的,这两个类型并没有任何继承关系,不符合类型转换的定义 ,因此会抛出ClassCastException异常;
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下 :
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true;如果变量不属于该数据类型,返回false;
可以使用instanceof将上面的测试类修改如下:
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
// 调用的是 Cat 的 eat
a.eat();
// 向下转型
if (a instanceof Cat) {
Cat c = (Cat)a;
c.catchMouse();
} else if (a instanceof Dog) {
Dog d = (Dog)a;
d.watchHouse();
}
}
}
来源:https://www.cnblogs.com/coder-zyc/p/10573005.html


猜你喜欢
- 前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本
- 1.问题描述在一个目录及子目录下查找 TXT或Java文件,从中搜索所有“对象”字样的行。在D盘中的所有文件中搜索含有“对象”的行。2.解题
- 1.使用matlab作闭合多边形图没有找到直接画多边形的函数,只能是将各个点的坐标保存在数组中,将一个点与其相邻的点相连,并将最后一个点与第
- 本文实例为大家分享了java启动线程的方法,供大家参考,具体内容如下1.继承Threadpublic class java_thread e
- 正在编译...1>Ipv4IPv6traceroutesrc.cpp1>d:\研究生\c++\study\test\test\i
- float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。而且使用BigDe
- 1.类成员与方法的可见性最小化举例:如果是一个private的方法,想删除就删除如果一个public的service方法,或者一个publi
- 本文分享了c#操作Excel的相关代码,还是比较全面的,其实无外乎存取,增删改查等操作,参考下。具体代码://引用Microsoft.Off
- c#里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它读取文件中的数据了么?真的能读完全么?通常我
- Java IO BufferedInputStream概要:BufferedInputStream是缓冲输入流,继承于Filte
- 网络应用模式主要有:主机/终端模式:集中计算,集中管理;客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理;浏
- 前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言。啥意思,就是 英、中、法、德、日。。。语言随意切
- 前言当线程池的线程阻塞时,线程池会创建额外的线程,而创建、销毁和调度线程所需要相当昂贵的内存资源,另外,很多的开发人员看见自己程序的线程没有
- 写在前面在这里,我们将会学习怎么利用java8 快速的打印出需要打印的元素利用stream打印元素在Java中,有三种不同的方法来打印Jav
- /// <summary>/// 人民币大写/// </summary>/// <param name=&qu
- 本文实例为大家分享了Opencv轮廓外背景颜色改变的具体代码,供大家参考,具体内容如下自行学习弄得简单代码,使用了图像中的轮廓发现以及提取,
- Android launcher中模拟按home键的实现Intent mHomeIntent = new Intent(Intent.ACT
- 范例说明Android的Widget,有许多是为了与User交互而特别设计的,但也有部分是作为程序提示、显示程序运行状态的Widget。现在
- 一致性哈希节点的增加和减少,大部分节点的 Hash一致package consistenthashimport ("hash/cr
- 第一节:服务端初始化首先看下在我们用户代码中netty的使用最简单的一个demo://创建boss和worker线程(1)EventLoop