两千字讲明白java中instanceof关键字的使用!

简介: 两千字讲明白java中instanceof关键字的使用!

写在开头

在过往的内容中,我们讲了不少的Java关键字,比如final、static、this、super等等,Java中的关键字非常之多,下图是整理的关键字集合

image.png

而我们今天要学习的就是其中的instanceof关键字!

instanceof的定义

instanceof 运算符是用来在运行时判断对象是否是指定类及其父类的一个实例(包括接口),因为比较的是对象,故不能应用于基本数据类型中!
其基本语法:

(object) instanceof (type)

咱们直接上一段代码,感受一下instanceof的魅力吧

public class Test {
   
   
    public static void main(String[] args) {
   
   
        Dog d =  new Dog();
        System.out.println(d instanceof Animal);
    }
}

class Animal {
   
   
    public void method1(){
   
   };
}
class Dog extends Animal{
   
   
}

输出:

true

这段代码满足“对象是否是指定类及其父类的一个实例”,所以才返回true。其实,这里面也涉及到Java中的is-a关系,在这里做一下小小的知识延伸吧

is-a、has-a、is-like-a

在Java中类与类之间存在继承与被继承关系,类与接口之间存在着实现与被实现关系,这些关系之间用了is-a、has-a、is-like-a来贴切的形容。

is-a

所谓is-a就子类属于唯一一个父类,因为Java是单继承

public class Animal{
   
   
    public void method1(){
   
   };
}
public class Dog extends Animal{
   
      // Dog is a Animal
}

has-a

所谓has-a就是前者拥有后者

public class A{
   
           // A has a B
    private B b;
}
public class B{
   
   
}

is-like-a

所谓is-like-a就是类实现接口的过程,类之所以能实现接口,是因为这个类会拥有接口抽象的某种行为,也就代表着他们之间存在着相似之处。

public interface I{
   
   
    public void method1();
}
public class A implements I{
   
       // A is like a I
    public void method1(){
   
   
    }
}

那么这时候,我们应该有这样一个思考:“在instanceof的定义中的那段代码,是证明了一个类对象属于它或者它父类的实例,那么如果一个类实现了一个接口,那么用instanceof去判断会返回true or false呢?”,带着疑问,我们来看如下这段代码:

public class Test {
   
   
    public static void main(String[] args) {
   
   
        Dog d =  new Dog();
        System.out.println(d instanceof Animal);
        System.out.println(d instanceof Active);
        //反例,输出为false
        System.out.println(d instanceof Other);
    }
}

class Animal {
   
   
    public void method1(){
   
   };
}
class Dog extends Animal implements Active{
   
   
    @Override
    public void run() {
   
   
        System.out.println("小狗子爱奔跑");
    }
}
interface Active{
   
   
     void run();
}
interface Other{
   
   
    void method();
}

输出:

true
true
false

由此可见,在接口中同样适用,所以赶紧回去把开头的话加上一个“(包括接口)”去,自我怀疑,自我验证,自我修改,成功闭环,哈哈哈!

instanceof的用法

了解了instanceof之后,我们应该渴望知道它的具体用法!通常,我们是这样使用 instanceof 操作符的。小二,上代码!

//JDK8中
// 先判断类型
if (obj instanceof String) {
   
   
    // 然后强制转换
    String s = (String) obj;
    // 然后才能使用
}

上面的代码中我们可以看到,我们可以通过instanceof判断后进行类型强转,从而满足我们想使用的类型,常用在反序列化中,避免因为类型转换错误带来ClassCastException 异常。
如上的写法在JDK16中迎来的优化,通过在 if 条件判断类型的时候添加一个变量,省略了强转和声明新的变量,简洁高效!

JDK16
if (obj instanceof String s) {
   
   
    // 如果类型匹配 直接使用 s
}
目录
相关文章
|
6天前
|
缓存 Java 程序员
深入理解Java关键字volatile(上)
深入理解Java关键字volatile
13 0
|
4天前
|
存储 安全 Java
【亮剑】Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
4天前
|
Java 编译器
【Java探索之旅】this 关键字 解决你的成员变量困惑
【Java探索之旅】this 关键字 解决你的成员变量困惑
12 0
|
5天前
|
Java
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
5 0
|
5天前
|
Java
Java里的关键字 __final
Java里的关键字 __final
|
6天前
|
缓存 Java
深入理解Java关键字volatile(下)
深入理解Java关键字volatile(下)
6 0
|
7天前
|
Java 编译器
【JAVA】volatile 关键字的作用
【JAVA】volatile 关键字的作用
|
7天前
|
Java
【JAVA面试题】final关键字的作用有哪些
【JAVA面试题】final关键字的作用有哪些
|
7天前
|
存储 安全 Java
聊聊Java关键字synchronized(下)
聊聊Java关键字synchronized(下)
7 0
|
7天前
|
监控 安全 Java
聊聊Java关键字synchronized(上)
聊聊Java关键字synchronized
7 0