Java向下转型以及如何判断能否向下转型

上一条博客中我们一起了解了Java向上转型的意思以及它的优点,但同时也知道了在向上转型的过程中子类对象将不能调用其独有的方法。那我们怎么样才能既实现向上转型,又能使子类可以调用其独有的方法呢,这就需要使用向下转型了。
注意
向下转型必须是在向上转型之后才能进行。

我们还是以汽车为例。代码如下:

class Car {
    public void run() {
        System.out.println("这是父类run()方法");
    }
}

public class Benz extends Car {
    public void run() {
        System.out.println("这是Benz的run()方法");
    }

    public void price() {
        System.out.println("Benz:800000$");
    }

    public static void main(String[] args) {
        Car car = new Benz();// 先进行向上类型转换
        // car.price(); 此时还不能调用子类独有方法
        Benz benz = (Benz) car;// 向下类型转换
        benz.price();// 经过向下类型转换后可以调用子类中独有的方法
    }
}

运行结果:这里写图片描述
此时我们通过向下转型成功的调用了子类中独有的方法,但是倘若我们没有先进行向上转型,也就是如下的代码:

    public static void main(String[] args) {
        Car car2 = new Car();
        Benz benz2 = (Benz)car2;
        benz2.price();
    }

编译使未报错,但运行后程序出现错误:
这里写图片描述
这个是指类型转换异常,因为我们一开始直接new了一个父类的对象,当我们后面去使用Benz去强制类型转换的时候,由于benz2是子类的对象,而car2是父类的对象,前者的域小于后者,这个时候我们直接向下转型就会发生这个错误。
所以使用向下转型之前必须先进行向上转型


对于上面这个异常,我们可以通过使用instanceof这个关键字来解决。
instanceof用法:
对象名 instanceof 类名 ,判断这个对象是否是属于这个类或是其子类
代码如下

public static void main(String[] args) {
        Car car2 = new Car();
        boolean result = car2 instanceof Benz;// 判断car2这个对象是否是Benz的类(或是其子类),返回的是一个布尔值
        if (result) {// 如果是(true),则可以进行向下类型转换
            Benz benz2 = (Benz) car2;
            benz2.price();
        } else {// false,输出
            System.out.println("不能进行向下类型转换");
        }

    }

运行结果:这里写图片描述
总结

向下转型在Java的泛型编程中应用较多,只要记住向下转型之前必须进行向上转型,且配合instanceof关键字一起使用就可以了。
  • 21
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值