日期:2014-05-20  浏览次数:20651 次

想问一下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]);
  }