本帖最后由 小伤口 于 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这个引用无法指向父类没有的方法