Object[]、强转具体数组类似Integer[]问题 -- 超详细

1. 前期准备

要想搞懂数组间的强制转换,则必须搞懂 普通的Java继承、以及反射问题

继承
Son
Father

根据上述的继承关系,则有下述两种代码

代码1 – 强转成功

Son s = new Son();
Father f = s;  
Son s2 = (Son)f;   


代码2 – 强转失败、并抛出类型转换异常

Father f = new Father();
Son s = (Son)c;

上述两段代码在代码运行前,编译器都没报错,说明静态编译是没问题的,那问题就是出在运行时
  1. 可以这样理解 父类对象绝不可以调用子类才有的方法,所以父类对象不可强转
  2. 子类对象继承了父类所有方法,当然可以调用父类的方法,所以运行状态时强转是没问题


  运行状态父类强转子类时,编译器会查看堆中的Class文件( 反射 )是否属于或在其范畴内强转类型 – 意思时说,看下面代码

  运行正常

Son son = new Son();
Father f = son;

System.out.println(f.getClass().getSimpleName());   // 依然输出 son

Son son2 = (Son)f;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0fU5JQv-1575820454539)(en-resource://database/12163:0)]


2. 数组强转问题

如果你真的理解我写的前期准备,看了下面这幅图你应该能懂了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rAHFWKl-1575820454549)(en-resource://database/12161:0)]

  为什么我说具体数组类是Object[]的子类

Integer[] nums = new Integer[1];
boolean flag =  nums instanceof Object[] ;

// 结果是true  -- 故 具体数组类是Object的子类


  注意:下面两段代码是一样的

Object[] b1 = {1,2,3}    // --  说明在堆中二进制文件就是Object[] 类型
Object[] b2 = new Object[]{ 1,2,3 }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tyJUiPU5-1575820454564)(en-resource://database/12165:0)]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值