我今天看core java 里边有一节给出了如下类似代码(这我做实验的,书上的跟我这个原理一样)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中的数组到底是实现了这种检查了吗?看他这段话就是实现了吧?可是为什么我在编译器里还能将父类实例引用放入子类数组中,而编译器却不报错? 郁闷
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异常 检查首先检测 类型是否匹配,如果不匹配就看能不能自动转换,比如反过来用父类存子类,那么就能够自动砍去子类多余的数据,实现了转换。
而你这里是子类转父类,可能因为你的子类的没有新的实例字段,导致父类也能转成子类了,所以保存成功了仅仅是猜测~~共同学习
int i = 1;
}
class SubC extends SuperC{
int b = 2;
boolean realy = false;
}
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();
}}
public static void main(String[] args) throws Exception {
System.out.println(args[10]);
}
编译期可能检测出下标越界吗?——args是命令行参数,运行的时候,用户可能在命令行输入10个参数,有可能一个参数也不输入。