由于向下转型(在继承层次中向上移动)会丢失聚类的类型信息,所以我们就想,通过向下转型-也就是在继承层次中向下移动-应该能够获取类型信息。然而,我们知道向上转型是安全的,因为基类不会具有大于导出类的接口。因此,我们通过基类接口发送的消息保证都能被接受。但是对于向下转型,例如,我们无法知道一个“几何形状”它确实就是一个“圆”,它可以是一个三角形、正方形或其他一些类型。

要解决这个问题,必须有某种方法来确保向下转型的正确性,使我们不至于贸易转型到一种错误类型,进而发出该对象无法接受的消息。这样做事极其不安全的。

在某些程序设计语言(如C++)中,我们必须执行一个特殊的操作来获得安全的向下转型。但是在Java语言中,所有转型都会得到检查!所以即使我们只是进行一次普通的加括弧形式的类型转换,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型。如果不是,就会返回一个ClassCastException(类转型异常)。这种在运行期间对类型进行检查的行为称作“运行时类型识别”(RTTI)。下面的例子说明RTTI的行为:

//: polymorphism/RTTI.java

// Downcasting & Runtime type information(RTTI).

// {ThrowsException}

class Useful {

public void f() {}

public void g() {}

}

class MoreUseful extends Useful {

public void f() {}

public void g() {}

public void u() {}

public void v() {}

public void w() {}

}

public class RTTI {

public static void main(String[] args) {

Useful[] x = {

new Useful(),

new MoreUseful()

};

x[0].f();

x[1].g();

// Compile time: method not found in Useful:

//! x[1].u();

((MoreUseful)x[1]).u(); // Downcast /RTTI

((MoreUseful)x[0]).u(); // Exception thrown

}

} ///:~

正如前一个示意图中所示,MoreUseful(更有用的)接口扩展了Useful(有用的)接口;但是由于它是继承而来的,所以它也可以向上转型到Useful类型。我们在main()方法中对数组x进行初始化时可以看到这种情况的发生。既然数组中的两个对象都属于Useful类,所以我们可以调用f()和g()这两个方法。如果我们试图调用u()方法(它只存在于MoreUseful),就会返回一条编译时出错消息。

如果想访问MoreUseful对象的扩展接口,就可以尝试进行向下转型。如果所转类型是正确的类型,那么转型成功;否则,就会返回一个ClassCastException异常。

java 向下转型运行时错误_8.5.2 向下转型与运行类型异常相关推荐

  1. java 向下转型运行时错误_java多态和向下转型问题。

    Q1:运行结果中dog2和dog3的引用都指向Dog,且引用地址都一样,但是为什么dog2为什么就不能用eat(i)方法呢?Q2:为什么运行结果都是true?Q3:我开始是Animalsdog2=ne ...

  2. Java向下转型以及如何判断能否向下转型

    上一条博客中我们一起了解了Java向上转型的意思以及它的优点,但同时也知道了在向上转型的过程中子类对象将不能调用其独有的方法.那我们怎么样才能既实现向上转型,又能使子类可以调用其独有的方法呢,这就需要 ...

  3. java version 和javac版本不一致_解决linux下javac -version和java -version版本显示不一致...

    [javascript] view plaincopy [root@localhost usr]# $JAVA_HOME/bin/java -version bash: /bin/java: 没有那个 ...

  4. java 编译 器 ide_在没有IDE的情况下编译和运行Java

    java 编译 器 ide 最近一个名为" 不使用IDE编译Java软件包 "的Java subreddit线程提出了一个问题:"是否有一个命令将软件包内的一组Java文 ...

  5. Java 7:在不丢失数据的情况下关闭NIO.2文件通道

    关闭异步文件通道可能非常困难. 如果您将I / O任务提交到异步通道,则需要确保正确执行了任务. 实际上,出于多种原因,这对于异步通道可能是一个棘手的要求. 默认的通道组使用守护进程线程作为工作线程, ...

  6. java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)

    这2个工具类都推荐使用统一个场景的不通过写法 推荐第一种 package com.gblfy.test;import java.io.BufferedInputStream; import java. ...

  7. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令

    学习java之电脑的常用快捷键和DOS窗口下的常用命令 电脑一些常用的快捷键 win快捷键: 单独按Windows:显示或隐藏 "开始"功能表 Windows+BREAK:显示&q ...

  8. 互联网短平快下,DevCloud如何支撑软件开发的“转型”?

    摘要:2013年踏入互联网浪潮的张浩,在8年的软件开发中,一一经历了这三段"历史进程",感受到技术迭代更新背后的魅力. 互联网改变人们的衣食住行,也在悄然无声间为根植之上的软件行业 ...

  9. java war包更新 部署_关于Linux系统下基于Tomcat部署和升级war包的详细过程

    1.首先Linux先安装java,Tomcat 中间件规范要求: 1)         软件必须下载到/services/download_soft_v        --------(用xftp上传 ...

最新文章

  1. 关于Docker目录挂载的总结(转)
  2. InvocationTargetException异常解析
  3. Chrome 控制台不完全指南
  4. 一步一步了解Promise原理
  5. Abp v0.18.0 新版本: MVC Module 启动模板
  6. kafka metric java,jmx_exporter+prometheus+grafana实现kafka metric监控
  7. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek
  8. ES6新特性_ES6_Symbol的介绍与创建---JavaScript_ECMAScript_ES6-ES11新特性工作笔记015
  9. java sqlite判断表是否存在_sqlite3 如何判断一个表是否已经存在于数据库中?
  10. 使用ADD命令将目录复制到Docker的其他目录
  11. java调用数据库存储过程的接口是_JAVA调用数据库存储过程
  12. windows 下使用 virtualenv 创建虚拟环境
  13. github android涂鸦,Android 涂鸦最佳实践
  14. K-Net 论文笔记
  15. MySQL-索引及其原理
  16. 手机如何压缩照片?压缩方法分享
  17. Altium designer18系列教程一 建工程和封装介绍
  18. 唯样商城:从黑暗到光明,LED照明演变史知多少?内有彩蛋
  19. ARM 开发板安装Alpine Linux (英)
  20. 沙盒勇者服务器维护,沙盒勇者攻略大全 沙盒勇者通关攻略

热门文章

  1. 遗传算法(包含选择、交叉、变异) MATLAB完整代码 中文注释详解
  2. ubuntu 系统狠慢 或者很卡的原因
  3. 竞价推广转化不好怎么办?
  4. IDEA 中使用 Big Data Tools 连接大数据组件
  5. oracle自动加一天,如何将Oracle 当前日期加一天、一分钟
  6. Unity初学:制作2D小游戏Sunny Land 1.游戏背景场景添加
  7. 2018_10_24 模拟赛
  8. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式
  9. 94.(leaflet之家)leaflet态势标绘-进攻方向绘制(燕尾)
  10. JS显示团购剩下时间的代码整理