• java_instanceof运算符的总结


    instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是一个接口),他用于判断前面的对象是否是后面的类或其子类,实现类的实例。但是java中使用instanceof有一个限制:instanceof运算符前面操作数的编译时类型必须是如下三种情况:
    1,与后面的类相同。
    2,是后面类的父类。
    3,是后面类的子类。

    一旦instanceof在=运算符通过了编译,程序进入运行阶段,如果塔实际引用的对象是第二个操作数的实例,或者是第二个操作数的子类,实现类的实例。那么instanceof运算的结果返回true.
    再来看一下下面这个代码:class InstanceofTest 
    {
            public static void main(String[] args) 
            {
                    Object str ="java";
                    //执行强制类型转换
                    //让math引用原来str引用对象

                    Math math = (Math)str; // 1
                    System.out.println("字符串是否是String的实例:"+(math instance String)); // 2
            }
    }
    这个程序编译不能通过。
    粗看之下,math实际引用的就是String对象,程序用stanceof判断他的类型应该输出true,没错。。如果程序可以通过编译,2行带密码确实输出true。

    问题是,当编译器编译java程序时,编译器无法检查引用变量实际引用对象的类型,它值检查该变量的编译时类型对于2行代码而言,math的编译时类型是math,math既不是String类型,也不是String类型的父类,或子类,因此程序无法通过编译,

    至于1行代码为什么没有出现编译错误,这和强制转型的机制有关,对于java的强制转型而言也可以分为编译,运行两个阶段来分析它。

    在编译阶段,强制转型要求被转型变量的编译时类型必须是以下3中情况,
    1,被转型变量的编译时类型与目标类型相同,
    2,被转型变量的编译时类型是目标类型父类。
    3,被转型变量的编译时类型是目标类型的子类,在这种情况下可以自动向上转型,无需强制转换,
      如果被转型变量的编译时类型与目标类型没有任何继承关系,编译器将提示编译错误,

    在运行阶段,不转型变量所引用对象的实际类型必须是目标类型的实例,或者是目标类型的子类,实现类的实例,否则在运行时会引发ClassCastException异常。
  • 相关阅读:
    如何用vue实现树形菜单?
    spring+springMVC,声明式事务失效,原因以及解决办法
    java提高同步锁的几点建议
    java自定义before和after
    java线程池
    jdk并发工具包之锁
    ReentrentLock重入锁
    java守护线程
    ReentrantLock
    java多线程基础
  • 原文地址:https://www.cnblogs.com/grkbeyond/p/4147270.html
Copyright © 2020-2023  润新知