我有这个练习:
public class TestClass{
public static void main(String args[]){
A[] a, a1;
B[] b;
a = new A[10];
a1 = a;
b = new B[20];
a = b; // 1
b = (B[]) a; // 2
b = (B[]) a1; // 3
}
}
class A { }
class B extends A { }
在我看来,当我写:a = b时,我正在向b中的对象分配另一个引用(a)。实际上,b中的对象有两个引用(a和b)。 但是,对于继承规则,子类也属于超类类型,但是超类也不属于子类类型。
如何将超类引用(a)分配给子类类型(b)?
这也适用于后续分配。
我认为,如果我写了:b = a,那么代码可以毫无问题地进行编译,但是对于赋值a = b,应该有一个编译错误。
为什么这个分配正确?
答案 0 :(得分:1)
假设A类是动物类,B类是狗类。 您可以创建一只狗(a = b)的动物,因为狗是动物(子类)。但是,这反过来是行不通的(b = a),因为动物的作用可能不止于猫之类的狗,因此您无法将猫指定为狗。因此,要做到这一点,您必须将动物明确地投射为狗(b =(Dog)a)。