本帖最后由 小伤口 于 2022-3-23 22:39 编辑
为什么要向上转型?
可以有效的避免重复写代码,举个例子:
比如父类是一个动物类
class Animal{
public Animal() {
}
public void name(){
System.out.println("我是动物");
}
}
他有两个子类,分别是鸟和狗
class Bird extends Animal{
public Bird() {
}
@Override
public void name() {
System.out.println("我是鸟");
}
}
class Dog extends Animal{
public Dog() {
}
@Override
public void name() {
System.out.println("我是狗");
}
}
现在我们有一个需求,是要获取所有子类的名称,如果没有向上转型,那么有多少个子类,就要写多少个获取子类名称的方法
有了向上转型,就只要写一个就可以了,像这样
public void getName(Animal animal){
animal.name();
}
向上转型为什么只能调用子类复写的方法
还是以上面的例子
这是向上转型实例化的过程
Animal animal=new Bird();
animal是Animal类型,但是他在堆内存其实开辟的是Bird类的空间,所以调用name方法是子类的name方法
如果子类有父类没有的方法,但是因为animal是Animal类型的引用,所以animal这个引用无法指向父类没有的方法