对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判断它们之间是否有关系(XXX  instanceof XXX), 下面代码,在增加了判断之后,发现不报异常了。证明就不能这样直接下转型。

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

        }

结果是什么都没有程序就结束了。严格来说,java是不支持这种直接下转型的!



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值