多态中的向上向下转型,以下面三个叠加继承类来说明
- 父类:Animal
public class Animal {
public void run1() {
System.out.println("Animal is running");
}
}
- 子类:Felidae(猫科)
public class Felidae extends Animal{
public void run2() {
System.out.println("Felidae is running");
}
}
- 孙类:Cat
public class Cat extends Felidae{
public void run3() {
System.out.println("Cat is running");
}
}
下面创建一个孙类实例cat
将其向上转型,即Animal animal = (Animal) cat;有种强制转换的味道,转换成Animal类型,然后用一个Animal类型的对象去接收,之所以说是向上转型是因为Animal是Car的爷爷辈,向上的,注意虽然创建的Cat的对象但转型成Animal之后就不能再使用Cat类中的方法了,即不能调用run3()
同样的向下转型,即Felidae felidae = (Felidae) animal;, 将Animal类型的对象animal向下转型成Felidae猫科动物对象,这里是向下转型因为Felidae是Animal的子类,注意转型成猫科这个中间层的类后,这个猫科对象可以调用父类的run1()和自身的run2(),但还是不能调用run3()
public class DemoAnimal {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat);
Animal animal = (Animal) cat;
System.out.println(animal);
Felidae felidae = (Felidae) animal;
System.out.println(felidae);
}
}
打印结果: 可以看出虽然是转型,变更了对象类型,但是从内存地址能看出始终是同一个对象
learn_api.Multi_test.Cat@1b6d3586
learn_api.Multi_test.Cat@1b6d3586
learn_api.Multi_test.Cat@1b6d3586