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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#图像处理之图像平移的方法
AndroidStudio:手势识别
![](https://img.aspxhome.com/file/2023/1/137261_0s.jpg)
深入理解java中的null“类型”
![](https://img.aspxhome.com/file/2023/4/132184_0s.jpg)
android TextView加下划线的方法
C#导出数据到Excel文件的方法
Java ThreadLocal类使用详解
![](https://img.aspxhome.com/file/2023/4/71014_0s.png)
自定义时间格式转换代码分享
Android studio 运行main 函数的方法
![](https://img.aspxhome.com/file/2023/5/89535_0s.png)
Android高仿IOS 滚轮选择控件
![](https://img.aspxhome.com/file/2023/6/122216_0s.gif)
C# using三种使用方法
SpringBoot中的PUT和Delete请求使用
![](https://img.aspxhome.com/file/2023/3/96053_0s.jpg)
Spring Boot项目实战之拦截器与过滤器
![](https://img.aspxhome.com/file/2023/0/72610_0s.png)
简单学习Java抽象类要点及实例
Java栈之链式栈存储结构的实现代码
Android7.0开发实现Launcher3去掉应用抽屉的方法详解
![](https://img.aspxhome.com/file/2023/0/138670_0s.jpg)
Json传输出现中文乱码问题的解决办法
实例讲解建立Android项目
![](https://img.aspxhome.com/file/2023/4/139334_0s.png)
java实现操作系统中的最佳置换Optimal算法
![](https://img.aspxhome.com/file/2023/0/76630_0s.jpg)