Java异常ClassCastException
时间:2019-03-21
本文章向大家介绍Java异常ClassCastException,主要包括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(); } } }
- 我用过的——Spring定时任务的几种用法
- CentOs7.3 搭建 SolrCloud 集群服务
- CentOs7.3 搭建 Solr单机服务
- CentOs7.3 搭建 ZooKeeper-3.4.9 Cluster 集群服务
- CentOs7.3 ssh 免密登录
- 基础篇章:关于 React Native 之 Touchable 系列组件的讲解
- 基础篇章:关于 React Native 之 Navigator 组件的讲解
- CentOs7.3 搭建 ZooKeeper-3.4.9 单机服务
- Ubuntu 17.04 编译安装 Nginx 1.9.9
- CentOS7.3 安装 iptables 与详细使用
- CentOs7.3 安装 maven3.5
- 基础篇章:关于 React Native 之 Picker 组件的讲解
- Java8的十大新特性你了解多少呢?
- spring 监听器
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 十七、详解 ES6 Modules
- 超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵肝出了这份图解!
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php
- Prism代码高亮Pjax重载函数
- Qt示例-AnalogClock-自定义窗体-使用QPainter的转换和缩放特性简化绘图
- 2019-12-27-traefik
- 2019-12-05-eck-qustion
- 聊聊dubbo-go的ConsumerSignFilter
- Javascript错误处理
- 程序员说模型过拟合的时候,说的是什么?
- 分分钟教会你搭建企业级的 npm 私有仓库