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;
2. 数组强转问题
如果你真的理解我写的前期准备,看了下面这幅图你应该能懂了
为什么我说具体数组类是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 }