写点什么

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

作者:EquatorCoco
  • 2024-01-25
    福建
  • 本文字数:1520 字

    阅读完需:约 5 分钟

写在开头


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



而我们今天要学习的就是其中的 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();}
复制代码


输出:


truetruefalse
复制代码


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


instanceof 的用法


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


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


上面的代码中我们可以看到,我们可以通过 instanceof 判断后进行类型强转,从而满足我们想使用的类型,常用在反序列化中,避免因为类型转换错误带来 ClassCastException 异常。


如上的写法在 JDK16 中迎来的优化,通过在 if 条件判断类型的时候添加一个变量,省略了强转和声明新的变量,简洁高效!


JDK16if (obj instanceof String s) {    // 如果类型匹配 直接使用 s}
复制代码


文章转载自:JavaBuild

原文链接:https://www.cnblogs.com/JavaBuild/p/17986253

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
两千字讲明白java中instanceof关键字的使用!_Java_EquatorCoco_InfoQ写作社区