为了账号安全,请及时绑定邮箱和手机立即绑定

关于instanceof的一个疑问

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

        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 回答

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

1 回复 有任何疑惑可以回复我~
#1

柒_夜4080291 提问者

非常感谢!
2016-11-25 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

an存储的是cat类的对象

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第二季 升级版
  • 参与学习       530560    人
  • 解答问题       6091    个

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

进入课程

关于instanceof的一个疑问

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信