JAVA向上转型和向下转型(二)

    xiaoxiao2021-03-25  91

    JAVA向下转型是不安全的。为什么呢?举个栗子。   定义父类:  public class Animal {     public void eat(){         System.out.println("吃饱了!");     }  }     子类: public class Dog extends Animal {     public void run(){         System.out.println("跑起来!!");     } } public class Bird extends Animal {     public void fly(){         System.out.println("飞起来!!");     } } 编写以下代码,执行:         Animal a = new Animal();         Bird b = (Bird)a;//向下转型         b.eat();         b.fly(); 编译没有问题,运行报错: Exception in thread "main" java.lang.ClassCastException: cn.xl.c3.Animal cannot be cast to cn.xl.c3.Bird     at cn.xl.c3.Test.main(Test.java:14) 结论:

    向上转型时,父类指向子类引用对象会遗失子类独有的新函数,在编译时,系统会提供找不到方法的错误。

    向上转型是安全的。

    向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以instanceof来避免出错此类错误。

    JAVA虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法。相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定,是多态的一种。动态绑定为解决实际的业务问题提供了很大的灵活性,是一种非常优美的机制。——《 JAVA动态绑定的内部实现机制》,作者  飞天金刚 。 由此可见,向下转型时,编译通过,但是运行的过程中虚拟机需要调用引用指向的实例方法,这时就会出现问题。 向上转型既然不安全是不是就没有用了,答案是否定的。详情参加《JAVA向上转型和向下转型(三)》
    转载请注明原文地址: https://ju.6miu.com/read-22437.html

    最新回复(0)