Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1601619
  • 博文数量: 43
  • 博客积分: 169
  • 博客等级: 入伍新兵
  • 技术积分: 1162
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-08 15:35
文章分类

全部博文(43)

文章存档

2021年(1)

2019年(4)

2016年(6)

2015年(8)

2013年(19)

2012年(5)

分类: Java

2013-03-17 10:32:38

java对象类型转换


        java对象类型转换,当对不具有相同类型的对象进行强制类型转换时,java运行时将抛出java.lang.ClassCastException的错误,这不单单是java不允许这样做,任何一种面向对象德开发语言都不允许的类型转换。所以今天只讨论对象继承关系下的向上转型和向下转型问题。
      java中向上、向下转型并不是什么高人定义的数据,它的命名原因跟象形文字的来源差不多,原因在于很早以前我们在设置类图时,总是习惯将父类放在上面,子类放在下面,然后通过一条父子连接线连接,就是这样从感官的角度 将子类向父类转换称之为“向上转型”  反之,为“向下转型”。
      在java开发中我们经常见到的为了降低程序间的耦合度,在定义某些类是通常使用的都是父类型,之后程序调用者就可以根据自己的需求将子类型赋值上去,实现功能上的调用,在这过程中就是运用了对象的向上转型,运行时通过后期绑定来实现对实际子类的调用。这样就实现了传说中java的多态功能。然而有些时候为了完成某些父类没有的功能,我们需要将向上转型后的父类再转成子类,实现其他的处理,这就是我们的向下转型。在这里,一定要切记一点在进行向下转型前一定要判断是否类型相同(isAssignFrom或instanceof),否则将抛出java.lang.ClassCastException的错误。
       这时候有人可能会有很多的误解(我也曾经被弄糊涂了),都说子类继承了父类,那么父子类之间具有相同的类型那么为什么不能够直接进行向下转型呢???  原因在于 子类继承父类是对父类所提供的服务接口的一个扩展,也就是说  父类提供的接口是子类所提供接口的一个子集,所以说单纯的父类对象时无法转型某个子类对象的。
      SuperClass super = new SuperClass;//创建父类对象
      SonClass son = (SonClass)super;  //这样的操作时完全错误的
我们可以再设计一下父类和子类的类结构:
SuperClass{
       public void printA(){System.out.println("Super printA");}
}
SonClass extends SuperClass{
      public void printA(){System.out.println("Son printA")} //对父类的一个覆写
      public void printB(){System.out.println("Son PrintB")}  //对父类的一个扩展接口
}
这个时候我们强制将父类对象向下转换成子类对象时,父类对象中没有printB()方法,这样就会造成混乱,所以在进行向下转型时一定要先判断父类的类型。
阅读(8515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~