instanceof作用
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
注意:
- 类的实例包含本身的实例,以及所有直接或间接子类的实例
- instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误(null用instanceof跟任何类型比较时都是false)
instanceof用法:
1.用于强制类型转换
public class C extends B {
private void print(Object a) {
System.out.println(a+" instanceof");
}
public void convert(String b) {
if (b instanceof Object) {
this.print(b);
}
}
}
public class InstanceofTest4 {
public static void main(String[] args) {
C c = new C();
c.convert("aa");
}
}
输出结果:
aa instanceof
注:"aa"是一个字符串常量,为什么可以放在instanceof的左边,原则上是只有实例化对象的引用(或者类)可以放在instanceof左边,这里咋看是放的一个常量“aa”,实际上在Java的常量机制中,他已经为我们自动装箱了,也就是这个常量被自动隐式转化成String类的实例化的对象了。
2.用于防止类型转换异常(classCastException)
如果我们直接用两个不同类型的对象进行.equals()运算,会报类型转换错误,如:
public class TestInstanceof {
public static void main(String[] args){
Person person1 = new Person("jenny",18);
ArrayList<String> list = new ArrayList<>();
boolean b1 = person1.equals(list);
}
}
异常信息:
我们知道,想要比较两个对象的属性,必须在对应的类中重写equals方法(快捷方式:alt+insert->code->equals() and hashcode()),这里我们可以顺便加上一个防止异常的判断:
person类中我们重写一下equals方法:
@Override
public boolean equals(Object obj) {
//防止类型转换异常
if (obj instanceof Person) {
Person p = (Person) obj;
boolean b = this.equals(p.name) && this.age == age;
return b;
}
//新增一个判断,如果是null,直接返回false
if (obj == null) {
return false;
}
//如果是this本身,直接返回true
if (obj == this) {
return true;
}
return false;
}
此时我们再运行TestInstanceof类:
就不再在抛类型转换的异常了