java向上转型_java 向上转型(upcasting)和向下转型(downcasting)区别举例详解

今天下午小龙在练习instanceof用法时突然想到java的upcating 和 downcasting 好像与此有关联,于是自己写了一个相关的案例,在此与众位看到的亲们分享一下,希望能帮到正在学习的伙伴们。

package com.instanceoftest; /**  java向上转型和向下转型,以及用instanceof方法来防止向下转型错误  * 接口说明   *interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员),  *所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的 abstract class。  *   * @author mengfl  *  */ interface Animal{ public static final String color = "blue";     //abstract void voice();     abstract void eat(); } class FlyAnimal implements Animal{ public void eat() { // TODO Auto-generated method stub System.out.println("父类 FlyAnimal eat worm!"); } public void voice() { // TODO Auto-generated method stub System.out.println("父类 FlyAnimal sing wonderful!"); }   } /*  * 继承接口  */ class Parrot extends FlyAnimal { @Override public void eat() { // TODO Auto-generated method stub System.out.println("parrot eat worm!"); }     @Override public void voice() { // TODO Auto-generated method stub System.out.println("parrot sing wonderful!"); }     public void jump(){ System.out.println("parrot can jump!");     } } class Instanceoftest {  public static void main(String[] args){  Animal a1 = new Parrot();  //a1.eat();//向上转型,只能调用父类Animal中的eat()方法  FlyAnimal a2 = new Parrot();//向上转型 // a2.eat(); // a2.voice();//向上转型,只能调用父类FlyAnimal中的eat()和voice()方法。     //  在向下转型过程中,分为两种情况: // //  情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。 // //  情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。实例如下:    Parrot a3 = (Parrot)a2;// 安全的向下转型,编译和运行皆不会出错。注意这是建立在向上转型的基础上的 // a3.eat(); // a3.voice(); // a3.jump();  FlyAnimal a4 = new FlyAnimal();  //运行到下面的   Parrot a5 = (Parrot)a4   方法时,报以下异常  //Exception in thread "main" java.lang.ClassCastException: com.instanceoftest.FlyAnimal cannot be cast to com.instanceoftest.Parrot   //  Parrot a5 = (Parrot)a4; //不安全的向下转型,编译无错但会运行会出错 //  a5.eat();  //  a5.voice(); //  a5.jump();    if(a4 instanceof Parrot){  Parrot a5 = (Parrot)a4;  a5.eat();   a5.voice();  a5.jump();  }    } } //总结  //1、父类引用可以指向子类对象,子类引用不能指向父类对象。 //例如:FlyAnimal flyAnimal = new Parrot(); 可以 //    Parrot a7 = new FlyAnimal();不可以 //2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。 // //    如Father father = new Son();//向上转型 //3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。 //在 FlyAnimal flyAnimal = new Parrot()中,如flyAnimal就是一个指向子类对象的父类引用 //,把flyAnimal赋给子类引用Parrot 即Parrot parrot =(Parrot)flyAnimal; //4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值