对java中的上转型和下转型的理解

首先我们声明一个Animal类,它是父类。 声明一个Dog类,是子类。在Dog类里,main方法进行测试。
package PrimaryTest;

public class Animal {
    float weight ;
    int height ;
    public void run(){
        System.out.println("I am an animal,i can run");
    }

    public void cry(){
        System.out.println("i am an animal ,i can cry");
    }
}
以下为上转型测试:
package PrimaryTest;

public class Dog extends Animal{
    public void run(){ //子类重写了run方法
        System.out.println("i am a god , i can run , different from others ");
    }

    public void bark(){ //子类特有的bark方法
        System.out.println("i am dog ,i can bark , wang wang wang !");
    }

    public static void main(String[] args) {
        //上转型 父类的引用指向子类对象,子类对象被当成了父类对象看待 ,子类会失去它自己特有的方法。
        Animal animal = new Dog();
        //animal.bark 已经是错误的,这个方法已经不能使用了。此时的new dog 狗对象已经上转型成了animal对象,失去了它的bark方法。
        animal.cry();   //这个方法还能正常使用
        System.out.println("------------------------");

        //如果是子类对象经过上转型后成为父类对象,那么它还可以进行下转型再次转换回子类对象
        Dog dog = (Dog) animal;
        dog.bark();

    }

}

运行main方法结果如下:

i am an animal ,i can cry
------------------------
i am dog ,i can bark , wang wang wang ! (上转型之后又下转型成功了,还能执行狗的bark方法!)


以下测试下转型测试(没有任何前提,子类的引用直接指向父类的对象):

 //下转型 子类的引用指向父类的对象,父类的对象被当成了子类看待,需要加强制转换!
        
//以下的代码,编译时候没报错,一运行就会报异常
        Dog dog2 = (Dog) new Animal(); //异常为:Exception in thread "main" java.lang.ClassCastException: PrimaryTest.Animal cannot be cast to PrimaryTest.Dog //很容易理解,我们可以说狗是一种动物,但不能说动物是狗。


而如果是这样写就不会报异常

if (new Animal() instanceof Dog){
            Dog dog2 = (Dog) new Animal();
            dog2.bark();

        }
但是 dog2执行方法后,结果是什么都没有程序就结束了。严格来说,java是不支持这种直接下转型的!(看很多人的博客说,下转型更多的是方便在泛型那块使用吧)





猜你喜欢

转载自blog.csdn.net/akanarika520/article/details/80011655