instanceof 和isInstance

本文详细介绍了Java中的instanceof关键字用于判断对象是否为指定类或其子类,以及isInstance()方法的使用场景,包括对象类型检查、多态和基本类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、instanceof 关键字

instanceof :

java的一个二元运算符,也是一个关键字
判断左边对象是否是右边类本身或者子类

A instanceof B:

A为对象实例(A只能为引用数据类型),B为类名
@Data
@SuperBuilder
@AllArgsConstructor
public class Test<T> {

}

public interface TestInterface {
}

@Data
@SuperBuilder
@AllArgsConstructor
public class MyTest extends Test<Character> implements TestInterface{

    public static void main(String[] args) {
        MyTest myTest = MyTest.builder().build();
        System.out.println(myTest instanceof MyTest);//true
        System.out.println(myTest instanceof Test);//true
        System.out.println(myTest instanceof TestInterface);//true
        
        System.out.println("hello world" instanceof String);//true
        System.out.println("hello world" instanceof Object);//true
        
		List<String> list = new ArrayList<>();
        System.out.println(list instanceof ArrayList);//true
        System.out.println(list instanceof Object);//true

        System.out.println(null instanceof Object);//false
        System.out.println(null instanceof String);//false
        System.out.println(null instanceof MyTest);//false

    }
}

注意左边只能为引用数据类型,否则会报错:
在这里插入图片描述

向上转型(多态):

子类对象可以向上转为父类对象,接口实现类对象可以向上转为接口对象。

null instanceof 都为false:

因为引用类型的默认值都为null,所以null可以转换成为任何类型,不属于任何类型

二、isInstance()方法

MyTest.class.isInstance(myTest)
判断对象是否是参数对象本身或者父类(推荐把父类写在前面,即父类调用方法) 参数可以是基本类型,自动做了装箱操做

注意自动拆装箱是在JDK1.5以后引入的

MyTest myTest = MyTest.builder().build();

//不推荐通过子类调用isInstance(),可能需要强转
System.out.println(MyTest.class.isInstance(myTest));//true
System.out.println(MyTest.class.isInstance(Test.builder().build()));//false
System.out.println(MyTest.class.isInstance((TestInterface)myTest));//true

System.out.println(MyTest.class.isInstance(new Object()));//false

//推荐把父类写在前面,即父类调用方法
System.out.println(TestInterface.class.isInstance(myTest));//true
System.out.println(Test.class.isInstance(myTest));//true
System.out.println(Object.class.isInstance(myTest));//true
System.out.println(Object.class.isInstance(new Object()));//true

System.out.println(Test.class.isInstance(new Object()));//false

List<Object> arrayList = new ArrayList<>();

System.out.println(List.class.isInstance(arrayList));//true
System.out.println(List.class.isInstance(new Object()));//false
System.out.println(List.class.isInstance(new LinkedList<>()));//true

//参数可以是基本类型 自动做了装箱操做
System.out.println(Integer.class.isInstance(1));//true
System.out.println(Integer.class.isInstance(1.1));//false

System.out.println(Double.class.isInstance(1.6));//true
System.out.println(Double.class.isInstance(1));//false
### Java `Class.isInstance` 方法的使用与示例 在 Java 中,`isInstance(Object obj)` 是 `java.lang.Class` 类的一个方法。它用于判断指定的对象是否是指定类 (即调用此方法的类对象) 的实例。如果对象是该类的实例,则返回 `true`; 否则返回 `false`。 以下是关于 `isInstance` 方法的一些重要特性以及其使用的具体例子: #### 特性描述 - **功能**: 判断某个对象是否属于特定类型的实例。 - **区别于 `instanceof` 关键字**: 虽然两者都用来检测类型兼容性,但 `isInstance` 是反射机制的一部分,而 `instanceof` 是编译期关键字[^1]。 #### 使用场景 当需要动态加载类并验证某些运行时对象是否为此类的实例时,可以使用 `isInstance` 方法。这通常发生在框架开发或者插件化架构设计中。 #### 示例代码 下面是一个具体的代码片段展示如何使用 `isInstance`: ```java // 定义几个不同类型的变量 Object stringObj = "Test String"; Object integerObj = new Integer(10); // 获取对应的 Class 对象 Class<?> stringClass = String.class; Class<?> integerClass = Integer.class; // 测试 isInstance 方法 boolean result1 = stringClass.isInstance(stringObj); // true boolean result2 = integerClass.isInstance(integerObj); // true boolean result3 = stringClass.isInstance(integerObj); // false boolean result4 = integerClass.isInstance(stringObj); // false System.out.println("Is 'stringObj' an instance of String? " + result1); System.out.println("Is 'integerObj' an instance of Integer? " + result2); System.out.println("Is 'integerObj' an instance of String? " + result3); System.out.println("Is 'stringObj' an instance of Integer? " + result4); ``` 上述程序通过获取字符串整数的 `Class` 对象,并利用它们分别测试两个实际对象所属关系,从而演示了 `isInstance` 的基本用途。 #### 注意事项 尽管 `isInstance` `instanceof` 都能完成类似的检查工作,但在性能上可能存在差异;一般情况下推荐优先考虑更简洁直观的方式——也就是直接采用 `instanceof` 运算符除非确实存在特殊需求需要用到反射技术中的 `isInstance`. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值