class A {}
class B extends A {}
嗨,我正在学习 Java,我试图理解为什么这是有效的:
A[] tab = new A[10];
tab[0] = new B();
而不是这个:
A[] tab = new B[10];
tab[0] = new A();
这行A[] tab = new B[10];
表示编译器在内存中为B预留了10个位置。 tab[0] = new A()
将 tab[0]
设置为等于新的 A
对象,该对象小于 (?) B
(B扩展A
)。
为什么会出现 ArrayStoreException: A
错误?它是如何工作的?
最佳答案
您可以在该对象内部存储该对象的子类。即B
可以存储在A
中,但是A
是B
类型的父类(super class)。基本上,继承链中类 X
下面的任何类都可以称为类型 X
,但继承链中类 X
上面的任何类都可以称为类型 X
不能被称为类型 X
。
你的例子
A[] tab = new A[10]; // Perfectly fine. Equal objects.
tab[0] = new B(); // B is a subclass of A, so this is allowed.
A[] tab = new B[10]; // Same principle as above, B is a subclass of A
tab[0] = new A(); // A is a SUPERCLASS of B, so it can not be referred to as A
简而言之,如果X
是Y
的子类,则X
只能被称为Y
。 (或者子类的子类。这是一个递归定义)。
让我们使用一些英语术语
让我们使用 Item
和 Book
,而不是 A
和 B
。
public class Item {}
public class Book extends Item {}
现在,可以说:
Item b = new Book(); // All Books are items.
这样说是没有意义的:
Book b = new Item(); // All items are definitely not books.
关于java - 尝试将数组的元素设置为父类(super class)对象时出现 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914132/