父类为什么不能强转为子类
网上解释如下:由于父类在创建对象时就分配了内存空间,子类的内存空间是一定大于父类的内存空间的,当父类强转为子类后就会发生内存空间不够时事情,因此不可强转。
于是我产生了一个疑惑,那子类不新增变量和方法,和父类需要的空间保持一致,就可以强转成功了?
事实上,是不可以的。
/**
* 子类继承父类,不新增任何变量和方法
*/
@Data
public class SmsSendSon extends SmsSendFather{
}
所以,到底是什么拒绝了父类强转为子类?
是编译器。
实际上,这是处于性能的考虑所设定的一条“法律”。
由于向上转型存在,一旦添加父类到子类的强转的特性,“同一父类的不同子类的互相转换”场景将灾难性地多。
比如,父类是动物,存在移动方法,子类存在鸽子和猫,鸽子有飞行方法,猫有抓老鼠的方法,你创建了一个猫实例对象强转成动物然后又强转成鸽子,然后对这个对象调用飞的方法。
ps:如果我有不全面的地方,欢迎大家一起交流。