• instanceof运算符与引用变量的强制类型转换


    一、instanceof运算符

    instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例该运算符返回boolean类型的数据。

    常见的用法为:result=object instanceof class。如果object是clas的一个实例,那么instanceof运算符返回true;如果object不是class的一个实例,或者object是null,那么instanceof运算符返回false。

    在使用instanceof运算符时需要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。下面的程序示范了instanceof运算符的用法。

    public class InstanceofTest {
    
        public static void main(String[] args) {
            //声明hello时使用Object类,则hello的编译类型是Object
            //Object是所有类的父类,但hello变量的实际类型是String
            Object hello = "hello";
            //String与Object类存在继承关系,可以进行instanceof运算,返回true
            System.out.println("字符串是否是Object类的实例:"+(hello instanceof Object));
            System.out.println("字符串是否是String类的实例:"+(hello instanceof String));
            //Math与Object类存在继承关系,可以进行instanceof运算,返回false
            System.out.println("字符串是否是Math类的实例:"+(hello instanceof Math));
            //String类实现了Comparable接口,所以返回true
            System.out.println("字符串是否是Comparable类的实例:"+(hello instanceof Comparable));
            String a = "hello";
            //String与Math类没有继承关系,所以下面代码编译无法通过
            System.out.println("字符串是否是Math类的实例:"+(a instanceof Math));
    
        }
    
    }

    上面程序通过Object hello = "hello";代码定义了一个hello变量,这个变量的编译时类型是Object类,但实际类型是String。因为Object类是所有类、接口的父类,因此可以执行hello instanceof String和hello instanceof Math等。

    但如果使用String a = "hello";代码定义的变量a,就不能执行a instanceof Math,因为a的编译类型是String,String类型既不是Math类型也不是Math类型的父类,所以这行代码编译就会出错。

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


     二、引用变量的强制类型转换

    编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用的对象确实包含该方法。如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符。

    类型转换运算符是小括号,其用法是:(type)variable,这种用法可以将variable变量转换成一个type类型的变量。除此之外,这个类型转换运算符还可以将一个引用类型变量转换成其子类类型。但这种强制类型转换不是万能的,需要注意以下两点:

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

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

    下面是进行强制类型转换的示范程序,说明了哪些情况可以进行类型转换,哪些情况不可以进行类型转换。

    public class ConversionTest {
    
        public static void main(String[] args) {
            double d = 13.4;
            long l = (long)d;
            System.out.println(l);
            int in = 5;
            //boolean b = (boolean)in;//编译出错
            Object obj = "hello";
            String str = (String)obj;//运行通过
            System.out.println(str);
            Object objPri = new Integer(5);
            String s = (String)objPri;//引发ClassCastException异常
    
        }
    
    }

    考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instanceof运算符来判断是否可以成功转换,例如上面的String s = (String)objPri,为了让程序更加健壮,可以将代码改为以下:

    if(objPri instanceof String) {
        String s = (String)objPri;
    }

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

    欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

       ▼微信扫一扫下图↓↓↓二维码关注

     

  • 相关阅读:
    为什么杜蕾斯的文案工资月薪5万?
    在独立音乐上,网易云音乐是如何甩了其他音乐平台几条街?
    两次大战,为什么德国成不了世界霸主呢?
    在大城市打拼的你,是想留下还是想攒够了钱回家?
    生存在互联网公司是种怎样的体验?
    5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
    放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权
    中国唯一的科技城
    互联网圈的6大奇葩大产品经理:张小龙不在乎手机碎屏,马化腾让用户一秒变白痴
    为什么说中国快递分两种:一种叫顺丰,一种叫快递?
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/11508783.html
Copyright © 2020-2023  润新知