软件编程
位置:首页>> 软件编程>> java编程>> Java异常ClassCastException的解决

Java异常ClassCastException的解决

作者:街头卖艺的肖邦  发布时间:2022-10-21 02:37:13 

标签:Java,异常,ClassCastException

在说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

0
投稿

猜你喜欢

  • 这篇文章主要介绍了Java JDBC导致的反序列化攻击原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
  • 之前封装过一个,但总觉得不够优雅,就有了这个通用封装,很简洁,不知道够不够优雅,不过原来那个有跟随指示器和丝滑滑动效果,感兴趣可以看一下。封
  • 我们先来看看公众号发放现金红包的效果:需要调用商户平台的接口,接口发放规则如下:1.发送频率限制——默认1800/min 2.发送个数上限—
  • Synchronized实现可见性原理可见性要实现共享变量的可见性,必须保证两点:线程修改后的共享变量值能够及时从工作内存刷新到主内存中其他
  • 一.什么是maven?Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一
  • 本文实例为大家分享了Java实现猜拳游戏的具体代码,供大家参考,具体内容如下一、问题简介通过控制台方式实现一个人机对战的猜拳游戏,用户通过输
  • 一、背景在通过Runnable接口创建线程时,启动线程需要借助Thread类,这里就涉及到了静态代理模式。二、实例以歌手演出为例,在演出的这
  • 目录前言:一、餐馆合并菜单二、改进菜单实现三、迭代器模式总结前言:迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是
  • Threadlocal有什么用:简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自
  • Java执行cmd命令//当前绝对路径System.out.println(IoUtil.read(Runtime.getRuntime()
  • 本文实例为大家分享了C#实现简易点餐功能的具体代码,供大家参考,具体内容如下图示效果实现过程1.设计界面2.设计控件及其属性3.实现点击事件
  • Controller如何进行重定向Spring MVC中进行重定向本人知道的有两种方式方法返回的URI(相对路径)中加上"redi
  • 本文实例讲述了java实现mp3合并的方法。分享给大家供大家参考。具体实现方法如下:package test;import java.io.
  • 一、HttpBasic模式的应用场景HttpBasic登录验证模式是Spring Security实现登录验证最简单的一种方式,也可以说是最
  • 昨天直接在机器上配置了Maven环境,今天顺便把Eclipse等IDE环境配置好。安装IDE Plugins的方法有很多。其一:在线安装,通
  • 今天学习了Mybatis执行存储,感觉不是那么好用,可能是我没用习惯。我先在SQLSERVER创建存储alter procedure usp
  • 时间格式化在项目中使用频率是非常高的,当我们的 API 接口返回结果,需要对其中某一个 date 字段属性进行特殊的格式化处理,通常会用到
  • 本文内容介绍通过Java程序在Excel表格中根据数据来创建透视表。环境准备需要使用Excel类库工具—Free Spire.XLS for
  • 本文实例讲述了Spring实战之@Autowire注解用法。分享给大家供大家参考,具体如下:一 配置<?xml version=&qu
  • 什么是命名查询? Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询 使用命名查询有什么好处? 由于使用H
手机版 软件编程 asp之家 www.aspxhome.com