本文主要是介绍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关键字一起使用就可以了。 |
这篇关于Java向下转型以及如何判断能否向下转型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!