引用变量的强制类型转换

当我们编写JAVA程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。

如果需要让这个引用变量来调用它运行时类型的方法,则是必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符。

 

强制类型转换时需要注意:

基本类型之间的转换只能在数值型之间进行,这里所说的数值类型包括整数型、字符型和浮点型。但数值型不能和布尔型之音进行类型转换。

引用类型之间的转换只能在继承关系之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误。

如果试图把一个父类实例转换子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类型),否则将在运行时引发ClassCastException异常。

 

package com.ez.impl;
/**
 * @author 窗外赏雪(EZ编程网)
 */
public class ConversionTest {
    public static void main(String[] args) {
        double price = 32.4;
        long lprice = (long) price; // 基本数据类型的强制类型转换

        int age = 5;
//      boolean b = (boolean)age;编译时出错:试图把一个数值型变量转换为boolean型

//      obj变量的编译时类型为Object,是String类型的父类,所以可以强制类型转换为Object
        Object obj = "窗外赏雪";

//      obj变量的运行时类型是String类型,所以可以强制类型转换为String
        String strObj = (String) obj;
//      obj变量的运行时类型是String类型,所以不可以强制类型转换为Integer
        Integer intObj=(Integer)obj;
    }
}

 

进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instanceof运行符来判断是否可以成功转换。

例如上面的String intObj = (Integer) obj; 代码运行时会引发ClassCastException异常,这是因为obj不可转换成Integer类型,

为了程序更加健壮,可以将代码改写如下:

if(obj instanceof Integer)

{

        Integer intObj = (Integer) obj;

}

 

在进行强制类型转换之前,先用instanceof运行符判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以保证程序更加健壮。

 

当把子类对象赋给父类引用变量时,被称为向上转型(upcasting)向上转型没必要手动强制类型转换,系统会自动完成这种转型。

这种转型只是表明这个引用变量的编译类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。并且总是可以成功的。

 

但把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,而且还可能在运行时产生ClassCastException异常,使用instanceof运行符可以让强制类型转换更安全。

 

instanceof运行符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的类,或者其子类的实例。如果是,则返回true,否则返回false.

 

注意:instanceof运行符前面操作数的编译时类型要么与后面的类相同,要么是后面类的父类,否则会引用编译错误。

Object obj= "窗外赏雪"; 代码定义了一个obj变量,这个变量编译时类型是Object类,但运行时类型是String。因为Object 是所有类、接口的父类,因此可以执行hello instanceof String和hello instanceof Integer等。

 

String str = "窗外赏雪";代码定义的变量str,就不能执行str instanceof Integer 因为str的编译时类型是String。String 类型既不是Integer类型,也不是Integer类型的父类,所以当执行到这段代码的时候会报错。

 

instanceof 运行符的作用是在执行强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功地转换,从而保证代码更加分健壮。

instanceof和(type)是JAVA提供的两个相关的运算符,通常先用instanceof判断一个对象是否可以强制类型转换,然后再使用(type)运算符进行强制类型转换,从而保证程序不会出现错误。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值