A是父类,B从A继承:
把子类对象当做父类对象来使用,父类引用指向子类对象就是向上转型(upcasting):
A a = new B();没有问题,向上转型是安全的,因为基类不会具有大于导出类的接口。
把父类对象当做子类对象来使用,就是向下转型(downcasting):
(在Java中,何时能将父类对象转换成子类对象?
为什么有的时候可以,而有的时候不能呢? )
B b = (B)new A();这是一定会报错的,
只有一种情况 向下转型 是安全的,那就是刚经过向上转型:
A a = new B();
B b = (B)a;
因为我们可以说,狗是一只动物,那么人家要求一只动物,我把狗仍里(upcasting),肯定没问题,
但是我们无法明确知道,一只动物它肯定就是一只狗,它也可能是一只猫,所以downcasting是不安全的,
那么
我刚经过upcasting,把一只狗转换成了一只动物,然后downcasting,再把它转回狗,肯定可以,
因为我明确的知道它本身就是一只狗,强制转换得能转才行。
JAVA遵循里氏代换原则,子类一定可以代替父类,不必强制类型转换,父类只能调用子类重写的方法,子类特有的方法,不可以调用
多态的表现..父类类型的变量可以指向子类对象,但子类类型的变量不能指向父类对象
比如有动物,马,猪,马和猪继承了动物,我们可以
动物 animal = new 动物();
animal = new 猪();
但不可以
猪 pig = new 猪();
pig = new 动物();
事先说好的能赚
不说好 不行