写在开头
在过往的内容中,我们讲了不少的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(); }
输出:
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理