教妹学Java(三十八):instanceof 操作符的用法

简介: 教妹学Java(三十八):instanceof 操作符的用法

三妹开学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。


“二哥,今天我们要学习的内容是‘instanceof 操作符’,对吧?”看来三妹已经提前预习了我上次留给她的作业。


“是的,三妹。instanceof 操作符主要用来判断对象属于哪种类型。 ”我面带着朴实无华的微笑回答着她,“可能是某个类,某个子类或者某个接口。”


“Java 中的 instanceof 操作符的返回结果为 true 或者 false,true 表示对象属于指定的类型,false 表示不属于。如果我们拿 instanceof 和值为 null 变量进行比较,返回结果都是 false。”


----正儿八经的分割线,正文开始------------


来看下面这个示例:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Simple {
    public static void main(String[] args) {
        Simple simple = new Simple();
        System.out.println(simple instanceof Simple);
    }
}



在上面这个例子中,我们使用 instanceof 判断 simple 这个引用变量是不是 Simple 类。输出结果如下所示:


true


一个子类的对象既是子类也是父类,来看下面这个示例:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
class Animal {}
public class Dog extends Animal{
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog instanceof Dog);
        System.out.println(dog instanceof Animal);
    }
}


程序输出结果如下所示:


true

true


当子类变量指向的是父类对象,这被称为“向下转型”。如果我们直接转的话,编译器将会报错。




如果强制向下转型的话,编译器不会报错,但运行是会报错。


class Animal {}
public class Dog extends Animal{
    public static void main(String[] args) {
        Dog dog1 = (Dog)new Animal();
    }
}



运行时抛出 ClassCastException 异常:


Exception in thread "main" java.lang.ClassCastException: class com.itwanger.thirtyeight.Animal cannot be cast to class com.itwanger.thirtyeight.Dog (com.itwanger.thirtyeight.Animal and com.itwanger.thirtyeight.Dog are in


来看一下 instanceof 操作符的具体使用场景:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Test {
    public static void main(String[] args) {
        I i = new B();
        Call call = new Call();
        call.invoke(i);
    }
}
interface I{}
class A implements I {
    public void a() {
        System.out.println("a");
    }
}
class B implements I {
    public void b() {
        System.out.println("b");
    }
}
class Call {
    void invoke(I i) {
        if (i instanceof A) {
            A a = (A)i;
            a.a();
        }
        if (i instanceof B) {
            B b = (B)i;
            b.b();
        }
    }
}



在上面的例子中,类 A 和类 B 都实现了接口 I, A 有一个 a() 方法,B 有一个 b() 方法,在 Call 类中,有一个 invoke() 方法,它的参数类型为 I,在方法体重,通过 instanceof 操作符判断参数 i 到底是 A 还是 B,如果是 A,对 i 向下转型为 A,然后调用 a() 方法,如果是 B ,对 i 向下转型为 B,然后调用 b() 方法。


来看一下程序的输出结果:


b


因为引用类型 i 指向的是对象 B。


“三妹,instanceof 操作符我们就学到这里吧,它的用法我相信你一定全部掌握了。”我揉一揉犯困的双眼,疲惫地给三妹说。


“好的,二哥,我这就去练习去。”三妹似乎意犹未尽,这种学习状态真令我感到开心。


相关文章
|
Java
Java中的equals()与==的区别与用法
【7月更文挑战第28天】
331 12
|
7月前
|
存储 安全 Java
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
560 0
|
11月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10387 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
1248 3
|
Java 编译器
Java“操作符 ... 不能应用于 x”解决
当Java编译器报错“操作符 ... 不能应用于 x”时,通常是因为你尝试对不支持该操作符的数据类型执行了操作。解决方法包括:确保数据类型兼容、使用正确的类型转换或选择合适的方法。检查代码中的变量类型和操作符使用是否正确。
188 4
|
安全 Java 测试技术
🌟 Java 零基础 | 详解 instanceof 运算符
【10月更文挑战第1天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
407 1
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
226 10
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
135 10
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
388 1
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
424 2
下一篇
oss云网关配置