想问一下java中java实现了数组安全检查了吗?
我今天看core java 里边有一节给出了如下类似代码(这我做实验的,书上的跟我这个原理一样)
Java code
class SuperC {
int i = 1;
}
class SubC extends SuperC{
}
public class InhTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SubC[] subc = new SubC[10];
SuperC[] superc = subc;
superc[0] = new SuperC();
System.out.println();
}
}
这println()中如果调用subc.i就会出错
然后书中突然来了一段话:为了确保不发生这类错误,所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中。例如,使用new managers[10]创建的数组是一个经理数组(我例子中就是SubC类)。如果试图存储一个Employee类型的引用就会引发ArrayStoreException异常。(然后就下一节内容了)---汗!!
【问】:那java中的数组到底是实现了这种检查了吗?看他这段话就是实现了吧?可是为什么我在编译器里还能将父类实例引用放入子类数组中,而编译器却不报错? 郁闷。。。
------解决方案--------------------会不会是这样:
ArrayStoreException异常 检查首先检测 类型是否匹配,如果不匹配就看能不能自动转换,比如反过来用父类存子类,那么就能够自动砍去子类多余的数据,实现了转换。
而你这里是子类转父类,可能因为你的子类的没有新的实例字段,导致父类也能转成子类了,所以保存成功了
仅仅是猜测~~共同学习
------解决方案--------------------有什么问题??
这个属于运行期(Runtime)异常,编译期无法检查的。编译器不是万能的,他只能检测100%必然错误的情况。举个例子,
Java code
public static void main(String[] args) throws Exception {
System.out.println(args[10]);
}