Java之强制类型转换

       在之前的文章中介绍过,将一个类型强制转换为另一个数据类型的过程称为强制类型转换。本文即将介绍的是继承过程中发生的引用类型转换。

       引用类型转换是指对象引用的强制类型转换,在了解对象引用的强制类型转换之前,先介绍一下对象引用能够指向什么样的对象。不管什么样的对象引用,均能指向其自身类型的对象实例,下面例子说明这个问题

Car c=new Car();

Truck t=new Truck();

另外,父类的应用变量还可以指向其派生出的直接或间接子类的对象。也就是说,只要类B派生自类A(类B可以不是类A的直接子类),类A的引用变量便可以指向类B的对象,例如,下面三个类的声明:

class Vehicle { }

class Car extends Vehicle { }

class Truck extends Car { }

Truck类继承自Car类,所以Truck类也是Vehicle类派生出来的子类(间接)。对于如上3个类的引用变量可以这样进行赋值:

Vehicle v=new Vehicle();

v=new Truck();

Car c=new Truck();

       上面代码中,汽车是交通工具,卡车不仅是汽车,而且也是交通工具。这样交通工具所具有的特征和行为,汽车和卡车也一定具有,可以将汽车或卡车看作交通工具,都是由父类引用指向子类对象。这是因为,由父类派生出来的子类,具有了父类的特征和行为,可以将子类对象看作父类对象。

        汽车具有的属性和行为,交通工具不一定具有,但卡车一定具有。因此可以说,汽车一定是交通工具,但交通工具不一定是汽车。所以,交通工具的类型的引用可以指向汽车或者卡车对象,汽车类型的引用可以指向卡车对象,但汽车引用则不能指向车辆对象。

       这样做的意义是实现基于继承的多态,有了多态可以大大提高程序的灵活型。所谓基于继承的多态是指,父类的应用可以根据需要将引用指向不同的子类对象,来调用不同的子类实现。这样父类引用的选择性将变得很灵活。

       Java中应用类型的转换实现起来比C++简单的多,如果一个对象与另一个对象没有任何的继承关系,那么它们就不能进行类型转换。下面的例子显示了如何进行类型的转换:

       编译运行上面代码,可以看出,虽然对象子类是Truck类的,但打印的是父类Car的成员变量。这是因为在运行时,对于成员变量的访问系统接受的是引用类型,引用是哪个类的,就访问哪个类的成员。若要访问子类Truck对象的成员,则需要将指向对象的父类引用转换为子类类型。

将上述代码13行修改:

上面代码中,在c引用前加上一对圆括号,在圆括号中放类名的语法称为强制类型转换,表示把Car型转换为Truck型。

       从上图的运行结果看出,此次打印的是子类的成员,因为引用的类型已经转换为子类Truck型了,需要注意的是,对于编译,只要被转换的引用类型与转换后的目标类型是派生或被派生关系,编译就会通过。

       强制类型转换的只是引用类型,真正指向的对象是不会发生变化的,可以将引用看作看待对象的角度,层次。这就像可以将红富士看作苹果,也可以看作水果一样,看待的角度、层次虽然变了,但苹果还是那个苹果。

 

  • 22
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值