复习的时候看到了关于向上造型和向下造型的问题:
–向上造型:
(1)父类型的变量指向不同类型的子类型.
调用的功能有不同的实现
Animal a = new Dog();
a.noise();//叫
a = new Cat();
a.noise();//叫
(2)不同的父类型变量指向同一个对象有不同的功能
ZhengYangDoor a = new ZhengYangDoor();
a.theftproof();//防盗
a.openDoor();//开门
InterA ia = a;
ia.theftproof();
--向下造型:
将父类型(接口)的变量赋值给子类型或者其他父类型(接口)的变量
只有向上造型无法满足需求时,才会向下造型
Animal a = new Dog();
Dog dog = (Dog)a;
dog.吃骨头();
Cat cat = (Cat)a;//编译通过,语法正确,运行期间,造型错误
cat.扑捉老鼠();
运行期间有可能会发生(类造型异常):java.lang.ClassCastException
为了避免出现错误:我们需要使用关键字instanceof来判断
对象是不是要转换成的类型
if(a instanceOf Cat){
Cat cat = (Cat)a;
}
原文:https://blog.csdn.net/yk_3215123/article/details/81462373
但有一些问题需要说一下:
1.如果这样定义一个对象
Animal a = new Animal();
a是无法被向下造型的,编译阶段会出错。
2.如果B是A的子类型,定义两个对象:
A a = new A();
B b = new B();
对b向上造型,(A)b相当于A b = new B();
所以当(A)b调用a和b共有的方法的时候,还是会调用b的方法。