在java中,子类数组的引用可以转换成超类数据的引用,而不需要采用强制类型转换.

在java中,子类数组的引用可以转换成超类数据的引用,而不需要采用强制类型转换.

问题描述:

图片说明
上面标记的拿个不存在的实例域是啥意思,其他的我都能看懂

子类的引用转换为超类的引用是不会出现问题的,属于向前转型
因为子类本身就属于超类,是is a的关系,但是调用staff[0] = new Employee(...) 的操作的时候,
实际上staff这个数组指向的是Manager的数组,而这个new只会将employee对象中的属性初始化,然而去调用manager[0]的时候,
我们知道manager[0]实际上不是Manager对象而是Employee对象,这个对象是没有setBonus这个方法的,但是因为我们使用的引用是manager,也就是第一行创建的Manager[]数组,这里就会发生向后转型
但是超类的集合是小于子类的集合的,导致超类部分已经被初始化,而子类部分没有被初始化,
因此调用超类没有的setBonus实际上是对Employee对象的调用,而这个对象根本没有这部分

可不可以这么理解,刚开始的时候manager数组和employee数组指向的是同一块在堆中的区域,但是当调用staff[0] = new Employee(...) 的操作的时候,,Staff[0]的指向便发生了变化,实际上manager还没有实例化,这个时候manager[0]并没有被实例化