您可以在该对象内存储对象的子类。ieB
可以存储在 中A
,但是A
是 type 的超类B
。基本上,继承链中 class 之下X
的任何类都可以称为 type X
,但继承链中 class 之上X
的任何类都不能称为 type 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
,ifX
是 的子类Y
。(或子类的子类。这是一个递归定义)。
让我们使用一些英语术语
代替A
and B
,让我们拥有Item
and Book
。
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.