关于instanceof的一个疑问

来源:10-2 多态中的引用类型转换

柒_夜4080291

2016-11-12 09:44

感觉自己钻牛角尖,一直有点懵

        Cat c=new Cat();//实例化一个对象c  它的类型是Cat

        Dog d=new Dog();
        Animals an=c; //自动类型提升,向上类型转换  c的类型由Cat转换为Animals
        System.out.println(an instanceof Cat);//true
        if(an instanceof Cat){  //用instanceof 判断an 是否是Cat类型 ?
            Cat c1=(Cat)an;//强制类型转换。转化为Cat类型 讲Animals 类型转换为 Cat类型
        }else{
            System.out.println("无法进行类型转换 转换成Cat类型");
        }
        System.out.println(an instanceof Dog);//false  
        if(an instanceof Dog){//instanceof 判断一个引用是否是某个类型或者某个类型的子类型
            Dog d1=(Dog)an;
        }else{
            System.out.println("无法进行类型转换 转换成Dog类型");
        }


具体的都在上面代码的注释里。然后主要问题就是,为什么 an instanceof Cat 为true 

an instanceof Dog 为false   Dog 和Cat都是Animals 的子类呀。

个人觉得问题是在Animals an=c;上,因为我将这句代码改成Animals an= d;结果就是相反的   但是这个代码不是向上类型转换么,转换的是c或者d的类型,会影响到an么。我有点转不过弯,有没大神为我解答下。万分感谢

写回答 关注

4回答

  • KeT
    2016-11-12 11:20:34
    已采纳

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。虽然发生了向上转型,但是,实质上内存存储的依然是Cat类的实例,所以,下边的an instanceof Dog,本质上an这个猫类的实例化对象,会是Dog类的实例吗?想想对象的指向,你就明白了。望采纳,谢谢。

    柒_夜408...

    非常感谢!

    2016-11-25 09:22:25

    共 1 条回复 >

  • 1mor3
    2016-11-24 20:05:48

    你的代码是进行编译的时候 编译的是dog类型 但是运行的时候 运行的是cat类型  

  • 沉沉浮浮
    2016-11-12 10:25:02

    an存储的是cat类的对象

  • stupidc
    2016-11-12 10:14:29

    我觉得an instanceof Cat这句话本身就有问题,an是一个对象,Cat是一个类,应该改为Animals instanceof Cat 和Animals instanceof  Dog应该就没问题了吧。

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530656 学习 · 6091 问题

查看课程

相似问题