欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

78.对象造型

程序员文章站 2022-03-02 11:29:36
...

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

 

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


当从子类转换成父类的时候(或者实现类转换成接口,下同),造型可以自动完成,比如,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;
}


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