Java 中的上转型和下转型

在我们的日常中,上转型和下转型都使用的比较少,所以当别人问起来什么是上转型,什么是下转型,自己往往一片模糊,或者不能将他们进行明显的区分。

在这里,我将以我个人理解来论述上下转型,希望对大家有帮助,如有不足,请指出,我会将此及时纠正。

首先概念:

  • 向上转型

是指将基类(也叫父类)引用转换为导出类(也叫子类)引用的动作

问题
在向上转型的过程中,我们容易出现方法丢失的问题,比如我们将一个导出类(子类)进行向上转型,但是在基类(父类)中可能缺少部分导出类(子类)的方法,所以我们对导出类(子类)进行向上转型之后,使用基类(父类)对象去调用方法,只能调用基类(父类)有的方法。

  • 向下转型

这个就和向上转型相对应,但是有一点,向下转型必须是在已经向上转型的基础上进行

计算
在这里,如何理解向下转型呢?它就如同一个数学问题,我将用短代码呈现:

//假设A为基类,也就是父类,B为导出类,也就是子类
A a;
a=new B();//这是进行上转型
B b=(B)a;//这是进行下转型

在这里面就相当于对a加了两个负号,然后负负得正,所以最后进行下转型后,对象b能够调用B类的所有方法,类似于"B b=new B()"。

在最后,我们上转型也好,下转型也罢,其实实际输出都是输出导出类(子类)的内容,不同的是,调用的对象不同,还有就是上转型的对象对造成方法丢失的情况。

以下是测试代码:


class Animal{
    public void show(){
        System.out.println("这是基类,也叫子类!");
    }
    public void walk(){
        System.out.println("走或飞");
    }
}
class Dog extends Animal{
    public void show(){
        System.out.println("这是导出类,也叫子类!");
    }
    public void walk(){
        System.out.println("四只脚走!");
    }
    public void smile(){
        System.out.println("dog smile!");
    }
}

public class Test {
    private static Object Dog;

    public static void main(String[] args){
        Animal animal=new Animal();
        Dog dog=new Dog();
        animal.show();
        dog.show();
        animal.walk();
        dog.walk();
        dog.smile();
        //这是将animal进行上转型
        animal=new Dog();
        //调用时写的虽然是基类(父类)方法,但是输出的是导出类(子类)重写后的值
        //对于我个人方便理解,我将它记为用基类(父类)调用导出类(子类)的方法
        animal.show();
        animal.walk();
        //((Dog) animal).smile();
        //下面进行下转型,下转型只能对经过上转型的对象进行下转型
        Dog dog_0=(Dog)animal;
        dog_0.walk();
        dog_0.show();
        dog_0.smile();
    }
}

输出结果如下所示:

这是基类,也叫子类!
这是导出类,也叫子类!
走或飞
四只脚走!
dog smile!
这是导出类,也叫子类!
四只脚走!
四只脚走!
这是导出类,也叫子类!
dog smile!

其类图如下所示:
测试类图

在测试过程中,我为了大家观看方便,将所有类写在一起,但是在实际生活中,最好是每个类分开写,这样也方便自己的一个了解与维护。

  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值