• 【Java】instanceof 关键字


    instanceof 通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例。

    1. 如果 object 是class 的一个实例,则 instanceof 运算符返回 true,如果 object 不是指定类的一个实例,或者object 是null, 则返回false。class 可以是类,可以是接口。
    2. instanceof 在Java 的编译状态 和 运行状态是有区别的:
    • 在编译状态中,class(指的是对象的引用)可以是object对象、父类,自身类,子类。在这三种情况下Java编译时不会报错。
    • 在运行状态中,class 可以是 object 对象,父类,自身类,不能其他是子类。在前面三种情况下 result 的结果为 true,最后一种为false。但是class为子类时编译不会报错。运行结果为false.(大致就是判断表达式:class 变量=(class)object的引用 是否立)。

     示例代码:

    AnimalParent.java

    1. package com.api.Demo06;
    2. public class AnimalParent {
    3. //public interface AnimalParent { //也可以时接口
    4. }

    Cat.java

    1. package com.api.Demo06;
    2. public class Cat extends AnimalParent{
    3. //public class Cat implements AnimalParent{
    4. }

    Dog.java

    1. package com.api.Demo06;
    2. public class Dog extends AnimalParent{
    3. //public class Dog implements AnimalParent{
    4. }

    Test.java

    1. package com.api.Demo06;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. //多态技术
    5. AnimalParent cat = new Cat();
    6. // 类型转换异常
    7. // Dog dog = (Dog) cat; //com.api.Demo06.Cat cannot be cast to com.api.Demo06.Dog
    8. // if(对象的引用 instanceof 具体的类型(类或接口))
    9. if (cat instanceof Dog) { //返回 布尔类型 是该类型 返回true,不是则返回false
    10. System.out.println("cat 是 Dog 类型");
    11. } else {
    12. System.out.println("cat 不是 Dog 类型");
    13. }
    14. /**
    15. * cat instanceof Dog 不是
    16. * cat instanceof Cat||AnimalParent||Object 是
    17. * 在编译状态中,class(对象的引用)可以是object对象的父类(AnimalParent),自身类(Cat),子类。
    18. * 在这三种情况下Java编译时不会报错。
    19. */
    20. // 强转时 程序可能会直接 抛出异常,所以可以使用 instanceof 判断一下
    21. if (cat instanceof Dog) {
    22. Dog dog = (Dog) cat;
    23. System.out.println("类型符合,可以强转");
    24. } else {
    25. System.out.println("类型不符,不能强转");
    26. }
    27. }
    28. /**
    29. * 在运行状态中,class 可以是 object 对象的父类(AnimalParent),自身类(Cat),不能是其他的子类(Dog、)。
    30. * 在前面两种情况下 result 的结果为 true,最后一种为false。
    31. */
    32. }

    下一篇文章:String类中equals方法源码解读

  • 相关阅读:
    第三届云原生编程挑战赛正式启动,Serverless 赛道邀你参加!
    「小邓观点」SIEM解决方案的九大组件
    14. Redisson 分布式锁
    Linux 应用程序CPU调度优化
    conda创建pytorch环境报错
    Maven的介绍和使用
    什么是序列化和反序列化?
    Redis的哨兵模式搭建
    区间选点问题-贪心-C++
    打开VsCode经常弹出:尝试在目标目录创建文件时发生一个错误:拒绝访问:重试 跳过这个文件(不推荐),关闭安装程序
  • 原文地址:https://blog.csdn.net/qq_57268251/article/details/133796341