前言

为什么要向上转型?

我们直接用继承父类的子类实例化子类对象不就好了吗?这不就可以既能访问子类的对象,也能访问父类对象了吗?如果我们要用被覆盖的父类的方法或者属性,那么用super调用不就好了吗?

介绍

向上转型

  1. 就是将子类对象赋值给父类类型的变量
  2. 向上转型是为了用父类变量来接受不同的子类对象,调用方法的时候传参父类对象,可以调用子类里不同的重写方法,得到不同的结果。
1
Person tom = new Student();

应用

父类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Animal {
public void sleep() {
System.out.println("小动物在睡觉");
}
public static void doSleep(Animal animal) {
// 此时的参数是父类对象,但是实际调用时传递的是子类对象,就是向上转型。
animal.sleep();
}
public static void main(String[] args) {
animal.doSleep(new Cat());
animal.doSleep(new Dog());
}
}
第一个子类
1
2
3
4
5
6
public class Cat extends Animal {
@Override
public void sleep() {
System.out.println("猫正在睡觉");
}
}
第二个子类
1
2
3
4
5
6
public class Dog extends Animal {
@Override
public void sleep() {
System.out.println("狗正在睡觉");
}
}
输出
1
2
猫正在睡觉
狗正在睡觉

如果不用向上转型则必须写两个 doSleep 方法,一个传递 Cat 类对象,一个传递 Dog 类对象。这还是两个子类,如果有多个子类就要写很多相同的方法,造成重复。可以看出向上转型更好的体现了类的多态性,增强了程序的间接性以及提高了代码的可扩展性。当需要用到子类特有的方法时可以向下转型,这也就是为什么要向下转型。

向下转型

必须强制转换
使用向下转型,必须先向上转型

1
2
Person jack = new Doctor();	//向上转型
Doctor dr = (Doctor)jack; //才能让jack向下转型当医生