instanceof关键字在Java中用于测试一个对象是否是一个特定类的实例,或者是该类的子类或实现类的实例。它是一个二元操作符,返回一个布尔值(true或false).
语法
Object instanceof ClassName
object:要进行类型检查的对象。
ClassName:要检查的类或接口。
主要作用
1.类型检查:确定对象是否是某个类的实例或是该类的子类的实例
2.避免类型转换异常:在进行类型转换之前,使用instanceof可以防止ClassCastException异常。
示例代码
public class InstanceofExample {
public static void main(Sting[] args) {
Animal animal = new Dog();
Dog dog = new Dog();
Cat cat = new Cat();
//类型检查
System.out.println(animal instanceof Animal); // true
System.out.println(animal instanceof Dog); // true
System.out.println(animal instanceof Cat); // false
// 避免类型转换异常
if(animal instanceof Dog){
Dog d = (Dog) animal;
System.out.println("Animal is a Dog");
}
if (animal instanceof Cat) {
Cat c = (Cat) animal; // 这段代码不会执行,因为animal并不是Cat的实例
} else {
System.out.println("Animal is not a Cat");
}
}
}
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
使用场景:
1.多态性检查:在多态性中,父类引用可以指向子类对象,使用instanceof可以检查实际引用的对象类型。
2.安全类型转换:在进行强制类型转换之前,使用instanceof确保对象是目标类型的实例,避免ClassCastException.
3.实现接口检查:检查一个对象是否实现某个接口。
注意事项
1.空值检查:如果左操作数为null,instanceof会返回false,因为null不是任何类的实例。
2.编译时检查:instanceof会在编译时进行类型检查,如果类型之前没有关系(例如不在同一个继承树中),编译器会报错。
示例代码(空值检查)
public class NullCheckExample {
public static void main(Sting[] args){
Animal animal = null;
System.out.println(animal instanceof Animal); // false
}
}
示例代码(编译时检查)
public class CompileCheckExample {
public static void main(String[] args) {
String str = "hello";
// 编译错误,因为String和Integer没有关系
// System.out.println(str instanceof Integer);
}
}