Java 作业子类到类,反之亦然

Java 作业子类到类,反之亦然,java,arrays,inheritance,variable-assignment,Java,Arrays,Inheritance,Variable Assignment,我有以下练习: 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

我有以下练习:

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,应该有编译错误


为什么这个作业是正确的

假设A类是动物类,B类是狗类。
您可以创建一个狗的动物(a=b),因为狗是动物(子类)。但这并不适用于另一种情况(b=a),因为动物可以比狗(如猫)更重要,因此不能将猫指定为狗。所以要做到这一点,您必须明确地将动物转换为狗(b=(Dog)a)

你不是新来的--为什么没有正确格式化你发布的代码?为你格式化
“实际上,b中的对象有两个引用(a和b)”
--不,这是一个由两个变量持有的引用
b=(b[])a1;//3
这将失败。它将编译,但会抛出异常,因为您正试图将A数组强制转换为B数组。
“如何将超类引用(A)分配给子类类型(B)?”
--这不会发生,除非在失败的代码行上。查看此示例:Object[]oo=new Object[1];字符串[]ss=新字符串[3];oo=ss//因为字符串也是对象。ss=oo//编译错误,因为对象不是Stringss=oo会给您一个编译错误,因为oo可能是一个非字符串对象。因此,如果您将其强制转换为:ss=(String[])oo,它将可以很好地编译。