初学者对象数组混淆
我无法理解在以下代码中声明数组时实际发生的情况。
class Type1 {
}
class Type2 extends Type1 {
public void method2() {
}
}
class Test {
public static void main(String[] args) {
Type1[] x = new Type2[2];
x[0] = new Type1(); // runtime error
x[1] = new Type2();
x[1].method2(); // syntax error
}
}
我认为由于数组声明的右侧是数组将由该类型的参考变量组成。如果这是真的,那么第一个错误是有意义的,因为我不能有一个子类型引用超类型。new Type2[2]
Type2
但是,为什么第二个错误发生在两行之后?Type2 不知道,所以引用变量知道该方法?这似乎是因为不知道,所以这是否意味着数组由该类型的参考变量组成?如果这是真的,为什么会发生第一个错误,因为它不再是引用超类型的子类型?method2()
Type1
method2
Type1
另外,为什么第一个错误是运行时错误,而另一个错误是语法错误?
请注意,我只是在第二门编程课程中,所以我的术语可能有点偏差。
编辑:这里的问题没有回答我的问题,因为它没有回答为什么数组中的元素不能调用,即使.我的问题与此不同,因为我的问题还询问为什么在第二个错误也发生时会发生第一个错误(为什么的元素不能引用和该类型的对象,同时不能调用)。我最初认为,如果发生一个错误,那么另一个错误就不会发生。我想要比较这两个错误,并给出一个更深入的解释,而不仅仅是多态性规则。x
method2()
x
Type 2
x
Type1
method2()