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

149 阅读1分钟

文章目录

1. 前期准备

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

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

代码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)]