scjp考试准备 - 11 - 类型转换2

本文通过一个具体的Java代码示例,详细解析了Java中类型转换的原理及如何避免ClassCastException异常的发生。并以一个生动的比喻解释了继承体系中的类型转换规则。

题目如下:

interface Foo{} 
      class Alpha implements Foo{} 
      class Beta extends Alpha{} 
      public class Delta extends Beta{ 
            public static void main(String[] args){ 
                  Beta x = new Beta(); 
                  //insert code here 
            } 
      } 
      

将下面哪一行代码插入如上所示的位置中会导致java.lang.ClassCastException:
      A.  Alpha a = x; 
     B.  Foo f = (Delta)x; 
     C.  Foo f = (Alpha)x; 
     D.  Beta b = (Beta)(Alpha)x;

 

java.lang.ClassCastException是指类型转换异常。一般发生在强制类型转换时,若对象真正的实例类型小于转换后的类型,在运行时就会产生ClassCastException。

在这道题中x是一个Beta实例,这是编译时就决定了的。所以x可以在Foo、Alpha、Beta等同级或低级类型中随意转换。但是他不能转为Delta类,因为它不具备Delta类的行为特征。

 

在这里神展开了下:代码世界其实是比较严格的,一级级的继承形成了一种金字塔式的结构。底层是最原始的超类或接口,只有最基本的技能,顶层则吸收了向下每一层的技能还演化出了自己独有的技能。当一个对象生于金字塔的某一级以后,一般只能在出生的这一级或较低的级别生存。即使它换了一个伪装,虽可以瞒过一时,但是真的工作时就必然会因为技能不足而露出马脚。不过也有些真正的超级对象,它们虽然天然高贵,但是因为生于较低等级,平时只能做这个等级或较低等级允许做的事情。可是当需要时,它们也会穿上红色内裤,披上斗篷,完成高等级才能完成的事情。

class Man{
      public int age = 100;
      public void move(){
            System.out.println("I'm running...");
      }
}

class Superman extends Man{
      public int age = 10000;
      public void move(){
            System.out.println("I'm flying...");
      }
}

public class Test{

      public static void main(String[]  args){
            Man clark = new Superman();
            
            System.out.println(clark.age);
            clark.move();
      }

}

执行结果:

image

转载于:https://www.cnblogs.com/amunote/p/3948324.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值