【发布时间】:2018-07-28 03:28:15
【问题描述】:
当我在以下代码中声明数组时,我无法理解实际发生的情况。
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 类型的引用变量。如果这是真的,那么第一个错误是有道理的,因为我不能有一个引用超类型的子类型。
但是,为什么第二个错误在那之后出现了两行? method2()不是Type2知道的,所以方法是引用变量知道的吗?似乎是因为Type1 不知道method2,所以这是否意味着数组包含Type1 类型的引用变量?如果这是真的,为什么会出现第一个错误,因为它不再是引用超类型的子类型?
另外,为什么第一个错误是运行时错误,而另一个是语法错误?
请注意,我只是在上我的第二门编程课程,所以我的术语可能有点偏离。
编辑:问题here 没有回答我的问题,因为它没有回答为什么像x 这样的数组元素不能调用method2(),即使Type 2 的x 的元素也是如此。我的问题因此而不同,因为我的问题还问为什么在第二个错误也发生时会发生第一个错误(为什么x 的元素不能引用Type1 类型的对象并且同时不能调用method2())。我原本以为,如果一个错误发生了,那么另一个错误就不会发生。我想要两个错误之间的比较,以及比简单的多态性规则更深入的解释。
【问题讨论】:
-
对于初学者来说,这确实是一个很好的问题。
-
第二个错误与第一个和数组有些无关 - 你会得到与非数组等效的相同错误 -
Type1 x = new Type2(); x.method2();
标签: java arrays oop polymorphism