`
liuwei1981
  • 浏览: 752829 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:156234
社区版块
存档分类
最新评论

78.对象造型

 
阅读更多

在讲述数据类型的时候,我们已经知道,各种简单数据类型之间是可以进行相互转换的,有些转换可以通过系统自动完成,而有些转换必须在程序中通过强制转换来完成。

 

而对于引用类型,也有一个相互转换的机制。同样的,在引用类型数据进行转换的时候,分为自动造型强制造型两种情况。


当从子类转换成父类的时候(或者实现类转换成接口,下同),造型可以自动完成,比如,Teacher是Person的子类,则如果将一个Teacher对象赋给一个Person类型的变量的时候,造型自动完成。


当从父类转换成子类的时候(或者接口转换成实现类),必须使用强制造型,比如,Teacher是Person的子类,如果需要将一个Person对象赋给一个Teacher类型变量的时候,必须使用强制造型。


对象的强制造型可以使用运算符“()”来完成,格式如下:
 SupClass sup = new SubClass();
 SubClass sub = (SubClass)sup;


需要注意的是,无论是自动造型还是强制造型,都只能用在有继承关系的对象之间

并不是任意的父类类型数据都可以被造型为子类类型,只有多态情况下,原本就是子类类型的对象被声明为父类的类型,才可以通过造型恢复其“真实面目”,否则会在程序运行时出错。


在造型的时候,往往需要使用instanceof来判断一个对象是否可以进行造型,以避免运行时的错误(Runtime error)。


比如,Person类有两个子类:Teacher 和Student,还有一个单独的类Test,我们来看下面的代码片断:
Test t = new Test();
Person p = new Student();

Teacher t = (Teacher)p;//将会出现运行时错误
Student s = (Student)t;//因为Test类和Student之间没有任何的继承关系
//所以在编译的时候就会出错(编译错误,compile error)


此时,可以先使用instanceof来判断要造型的对象是否为可以造型的类型,如:


Person p = new Student();
if(p instanceof Teacher){
 Teacher t = (Teacher)p;
}


这样就可以避免出现运行时错误。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics