在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。

当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较强的类型强制转功能较弱的对象时,就不一定可以行了。

举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:

 Father father = new Son();

在这里Son 对象实例被向上转型为father了,但是请注意这个father对象实例在内存中的本质还是Son类型的,只是new Son()的引用类型被设置为Father而已
这里有必要提一下: Father father = new Father (); 中的 Father 的作用是指示表量father所引用的对象的类型, 在Java中, 任何对象变量的值都是对存储在另外一个地方的一个对象的引用, 一个对象变量并没有实际包含一个对象, 而仅仅引用了一个对象

Son son = (Son) father;

这条语句是可行的,变量son引用了变量father的地址, 而father引用的对象地址是new Son()创建的Son类型的对象,这里只是将引用的类型强转为Son,而其本质引用地址所存储的对象就是Son类型的,所以是可行的

测试:

public static void main(String[] args) {Father father = new Son();Son son = (Son) father;System.out.println(father);System.out.println(son);
}

控制台输出:
com.lic.demo.Manager@15db9742
com.lic.demo.Manager@15db9742
son和father引用的地址是相同的

前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?

当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

public static void main(String[] args) {Father father = new  Father();Father father = new Father ();Son son = (Son) father;
}

这个系统会抛出ClassCastException异常信息:

Exception in thread "main" java.lang.ClassCastException: com.lic.demo.Father cannot be cast to com.lic.demo.Son at com.lic.demo.Test.main(Test.java:10)

为什么在这种情况父类强制转换成子类会抛异常呢?
如果是子类强制转换成父类: 那么该Son类型对象的引用为Father类型, 由于Son类型是对Father类型的扩展, 所以在调用Father引用的方法在Son对象中都是存在的, 即可行;
如果父类强制转换成子类: 父类引用的对象是Father类型的, 在强转之后, Father类型对象的引用为Son类型, 而被引用的对象仍是Father类型的, 因此, 在调用方法时,Son中扩展的方法在引用的Father类型对象中并不存在, 一个对象不可能调用一个该对象中不存在方法, 所以不可行! 如果父类引用的对象时是Son类型的, 那么在强转后是Son类型引用的是Son类型的对象, 是可行的

注意: 编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

可以在强转时先进行判断:

Father father = new Father();
if(father instanceof Son){Son son = (Son) father;
}

instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。即:如果father是Son对象的引用,则可以进行强转
instanceof 用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。

如果存在不正确的内容, 欢迎指正!

Java基础_引用数据类型的强制类型转换相关推荐

  1. C语言基础专题 - 数据类型与强制类型转换(编辑中)

    C语言 - 数据类型与强制类型转换 1.C数据类型 可以参考的相关知识链接: C语言基础专题 - 指针 C语言基础专题 - 数组 C语言基础专题 - 字符串 C语言基础专题 - 结构体 C语言基础专题 ...

  2. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  3. Java中的引用数据类型-BigDecimal

    BigDecimal不属于基本数据类型,属于Java对象(引用数据类型),精度极高 1.字符串转BigDecimal String str="24999.82"; BigDecim ...

  4. java中的基本数据类型和运算符_【Java基础】基本数据类型和运算符

    基本数据类型: 数值型: 整型: ① byte,1byte = 8bit(8位),储存是有符号的,以二进制补码表示的整数. 最小值为-128,最大值为127,默认值为0. byte在大型数组中可以显著 ...

  5. JAVA基础之变量(数据类型及其转换)

    变量 变量的概念: 内存中的一个存储区域: 该区域的数据可以在同一类型范围内不断变化: 变量是程序中最基本的存储单元.包含变量类型.变量名和存储的值. 变量的作用: 用于在内存中保存数据. 使用变量注 ...

  6. java基础_题库详解

    删除线格式 # 1 JDK和JRE有什么区别? JRE:Java Runtime Environment( java 运行时环境).即java程序的运行时环境,包含了 java 虚拟机,java基础类 ...

  7. 新的JAVA基础第一天---数据类型等

    内容 java基础知识, java流程控制语句, 常用包和类 ,数组操作, 面向对象的概念 ,异常处理 ,文件访问iO流, 数据集合操作, 集合框架 jDBC访问数据库 目标掌握基础 java语言简介 ...

  8. 【java基础06:数据类型】及拓展、转义字符、计算机二进制的表现形式

    目录 JAVA是强类型语言,所有的变量必须先定义才能使用. 计算机只认识二进制,那么计算机是怎么表示现实世界当中的文字的呢? 计算机二进制的三种表现方式:源码.反码.补码 char类型 整数型 整数型 ...

  9. 前端牛客网刷题总结【 JS基础变量、数据类型、数据类型转换、运算符等】

    1.JavaScript是解释性语言.正确.体现在JS文件在完成之后,不会经过任何的编译.而是在运行时去解释执行.最好的例子就是,JS中一个函数有语法的错误,但是不会因为这个局部的错误而影响其他函数运 ...

最新文章

  1. 【学界】深度学习如何影响运筹学?
  2. 2021高考成绩一分段查询陕西省,2021年陕西高考一分一段表查询排名方法 成绩排名位次什么时候公布...
  3. 无厘头的mysql故障排除
  4. java大量的print影响性能吗_printStackTrace()造成的性能瓶颈
  5. python编程入门经典实例-编程语言入门经典100例【Python版】
  6. [AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)
  7. python有序数组中删除元素_python刷LeetCode:26. 删除排序数组中的重复项
  8. 转转钓鱼php,最新转转钓鱼源码程序网站微信:mm88wk 最新转转源码 - 下载 - 搜珍网...
  9. 附录:更多列表操作命令
  10. 以太网实习_从最初有从事IT的想法,到现在实习两个月的感受
  11. 老身掐指一算,国产游戏“出海”正当时?
  12. android activity根节点addview_Android嵌入到页面中的加载动画工具类
  13. apache-storm例子:统计句子中的单词数量
  14. 电信无线路由器服务器网站,电信拨号上网连无线路由器的方法
  15. 在Exchange server 2007中管理pop3和IMAP4协议访问
  16. 项目记录-手机号码限制频次
  17. 备份Ubuntu 并制作成iso安装文件
  18. 芯片在计算机中作用是什么,逻辑芯片的作用是什么
  19. TIPOP 出货单单头
  20. PDF转换成word免费

热门文章

  1. 开启xmp1还是2_2020幸运召唤师最新消息 每个大区均可以参与还是一个QQ参与一次...
  2. Week of 5.2
  3. 直播源码开发,Android 屏蔽返回键(后退键)
  4. 在庫転送オーダーでのプラント間返品および店舗返品(メモ)
  5. Android基础知识~入门进阶,一步步走到高手
  6. 惠普电脑(HP PHILIPS系列)安装ubuntu后无法连接WIFI解决方案(手动安装8821CE驱动)...
  7. 中兴通讯5G OLT应急抢通解决方案荣获2022年度大奖!
  8. i5 1130g7参数 i51130g7怎么样
  9. Eric Schmidt 继续对用户隐私发表 “雷人语录”
  10. 网络精英赛模拟练习(5)