赋值 subclass 到 class,反之亦然
Assignments subclass to class and vice versa
我有这个练习:
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,应该会出现编译错误。
为什么这个分配是正确的?
假设 Class A 是 Class 动物,Class B 是 Class 狗。
您可以创建一种动物,即狗 (a = b),因为狗是动物(子类)。但这并不适用于相反的方式 (b = a),因为动物可以不仅仅是狗,例如猫,所以你不能将猫指定为狗。因此,要做到这一点,您必须明确地将 Animal 转换为 Dog (b = (Dog) a)。
我有这个练习:
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,应该会出现编译错误。
为什么这个分配是正确的?
假设 Class A 是 Class 动物,Class B 是 Class 狗。 您可以创建一种动物,即狗 (a = b),因为狗是动物(子类)。但这并不适用于相反的方式 (b = a),因为动物可以不仅仅是狗,例如猫,所以你不能将猫指定为狗。因此,要做到这一点,您必须明确地将 Animal 转换为 Dog (b = (Dog) a)。