营销网站制作企业,成都医院做网站建设,wordpress ask me,凡客另一购物网站写在开头
在过往的内容中#xff0c;我们讲了不少的Java关键字#xff0c;比如final、static、this、super等等#xff0c;Java中的关键字非常之多#xff0c;下图是整理的关键字集合 而我们今天要学习的就是其中的instanceof关键字#xff01;
instanceof的定义
inst…写在开头
在过往的内容中我们讲了不少的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 Bprivate 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 Ipublic 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);//反例输出为falseSystem.out.println(d instanceof Other);}
}class Animal {public void method1(){};
}
class Dog extends Animal implements Active{Overridepublic 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
}