【Java用法】Java关键字 —— instanceof

简介: 【Java用法】Java关键字 —— instanceof

instanceof 严格来说是 Java 中的一个双目运算符,用来测试一个对象是否为一个类的实例,具体用法为:

boolean result = object instanceof Class

其中 object 为一个对象,Class 表示一个类或者一个接口,当 object Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果 result 都返回 true,否则返回 false

Tips:编译器会检查 object 是否能转换成右边的 Class 类型,如果不能转换则直接报错,如果不能确定其类型,则编译通过,具体类型则看运行时确定。

以下讲一下注意事项:

1、object 不能是基本类型,必须为引用类型

int i = 1;
System.out.println(i instanceof Object); //编译不通过 会报错(Inconvertible types; cannot cast 'int' to 'java.lang.Object')
System.out.println(i instanceof Integer); //编译不通过 会报错(Inconvertible types; cannot cast 'int' to 'java.lang.Integer')

instanceof 运算符只能用作对象的判断。

2、object Class 类的实例对象

Double d = new Double(1);
System.out.println(d instanceof Double); // true

这是最普遍的一种用法。

3、object null

4、object Class 接口的实现类

例如我们常用的 ArrayList 就是 List 的实现类,HashMap Map 的实现类,所以我们用 instanceof 运算符判断 某个对象是否是 List / Map 接口的实现类,如果是返回 true,否则返回 false

ArrayList<String> arrayList = new ArrayList<>();
System.out.println(arrayList instanceof List); // true
HashMap<String, Object> hashMap = new HashMap<>(16);
System.out.println(hashMap instanceof Map); // true
System.out.println(StrUtil.center("分隔线", 10, "-"));
List<String> stringList = new ArrayList<>();
System.out.println(stringList instanceof ArrayList); // true
Map<String, Object> stringObjectMap = new HashMap<>(16);
System.out.println(stringObjectMap instanceof HashMap); // true

输出结果:

5、object 为 Class 类的继承类(包括直接或间接继承)

public class Animal {
}
class Dog extends Animal {
}
class Test {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Dog dog = new Dog();
        System.out.println(animal1 instanceof Dog); // false
        System.out.println(animal1 instanceof Animal); // true
        System.out.println(animal2 instanceof Dog); // true
        System.out.println(dog instanceof Animal); // true
        System.out.println(dog instanceof Dog); // true
    }
}

注意第一种情况, animal1 instanceof DogDog Animal 的子类,而 Animal 不是 Dog 的子类,所以返回结果为 false

 

完结!


相关文章
|
4天前
|
缓存 Java 程序员
深入理解Java关键字volatile(上)
深入理解Java关键字volatile
12 0
|
1天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
7 2
|
2天前
|
Java
java lambda 表达式中的双冒号和箭头的用法
java lambda 表达式中的双冒号和箭头的用法
|
2天前
|
Java
java中break和continue的用法例子
java中break和continue的用法例子
|
2天前
|
Java
Java中return的两种用法
Java中return的两种用法
|
2天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
2天前
|
存储 安全 Java
【亮剑】Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
3天前
|
Java 编译器
【Java探索之旅】this 关键字 解决你的成员变量困惑
【Java探索之旅】this 关键字 解决你的成员变量困惑
11 0
|
3天前
|
Java
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
5 0
|
3天前
|
Java
Java里的关键字 __final
Java里的关键字 __final