首页 理论教育 引用类型的转换

引用类型的转换

时间:2022-02-28 理论教育 版权反馈
【摘要】:现在一个叫张三的人考取了驾照A。对应的Java语句是:LicenseA obj=new LicenseA();。引用类型规定了该类型对象应该具有的成员变量和成员方法。这正如张三能驾驶三类车,是LicenseA类型,这一点始终不会变。而张三在只有货车和小汽车的单位当司机,那么,张三就不可能开大客车。这相当于“张三”这个引用值的类型变为LicenseB。总之,引用类型的转换是有规则的,不是任意的。参数传递时,将自动进行引用赋值转换。

5.6.1 引用类型的转换

这里先讨论几个现实生活中的例子,用它们来类比引用类型的转换。

汽车驾照分为:A类、B类和C类。其中,持A类驾照人员能驾驶大客车、大货车和小汽车;持B类驾照人员能驾驶大货车和小汽车;持C类驾照人员只能驾驶小汽车。这样,按面向对象的观点,可设计3个类:类LicenseA、类LicenseB和类LicenseC。类LicenseA的直接父类是类LicenseB,类LicenseB的直接父类是类LicenseC。现在一个叫张三的人考取了驾照A。对应的Java语句是:LicenseA obj=new LicenseA();。

这里,张三这个人相当于LicenseA对象,名字“张三”代表(或指向)张三本人,相当于对象的引用值(引用值保存在引用变量obj中),驾照A是类型,相当于类LicenseA。

引用类型规定了该类型对象应该具有的成员变量和成员方法。引用类型的实例化表明创建了该类的一个对象,它具有相应的成员变量和成员方法。而使用这些变量和方法必须通过对象的引用值(引用变量obj记录它),而引用变量obj是具有数据类型的。

对象在其生命周期里,类型是不变的,而其引用值类型是可转换的。这正如张三能驾驶三类车,是LicenseA类型,这一点始终不会变。而张三在只有货车和小汽车的单位当司机,那么,张三就不可能开大客车。这相当于“张三”这个引用值的类型变为LicenseB。对应的Java语句可能是:LicenseB o=obj;或(LicenseB)obj。

现实生活中还有许多这样的例子。又如,定义职员类Employee和管理人员类Manager。其中,职员类Employee从事具体工作;管理人员类Manager从事管理工作和具体工作。并且职员类是管理人员类的父类。一个管理人员把他放在管理岗位上,他就从事管理工作;把他放在职员岗位上,他就从事具体工作。而一个职员只能放在职员岗位上。又如,有线数字电视能够接收所有的数字频道。实际接收频道取决于你购买的是50个频道的套餐、80个频道的套餐还是120个频道的套餐。

正如持A类驾照人员可当持B类驾照人员使用,反之不行。与此对应的,LicenseA的引用变量可赋给LicenseB的引用变量,而LicenseB的引用变量不能赋给LicenseA的引用变量。总之,引用类型的转换是有规则的,不是任意的。

小结 (1)一个对象引用值能被转换为:

·任何一个父类型,即一个子类的引用型变量可转换当做父类类型的引用型变量。

·对象所属类实现的接口,即接口的引用型变量可指向任何实现了此接口的类对象。

·回到它自己所在的类,即一个对象引用变量被转换为父类或接口后,可再转换回来。

(2)一个接口引用能被转换为:

·任何一个父类型接口。

·回到它自己所在的接口。

1.自动赋值转换

对于基本类型数据,相容类型之间存储量低的自动向存储量高的类型转换。

当把一个对象引用值赋给一个不同类型的引用变量时,系统将进行引用类型赋值转换处理:一个引用值被转换成更一般的类(父类)或接口时,系统会自动进行赋值转换;否则,将产生编译错误。

在方法调用中,如果方法的形参是引用类型,那么实参的引用值必须能够赋值转换成形参的引用类型。参数传递时,将自动进行引用赋值转换。

2.强制转换

基本类型数据强制转换举例

img321

引用类型强制转换的一般格式如下:

img322

在运行时,编译器检验该引用值引用的对象的类是否与新类型兼容。这里,所谓兼容是指对象的类能够赋值转换成新类型。每个引用变量都有固定的类型,但其引用对象的类是不固定的。一个引用变量到底引用哪个类的一个对象,只有在运行时才能确定。

下面是引用类型转换的几个例子。

img323

注意:基本类型的转换和引用类型的转换含义不同:对于基本类型数据,转换是将数据只从一种类型转换到另一种类型的过程;对于引用类型的对象,只是引用值的类型转换,并不改变对象的类型。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈