InstanceOf
强制类型转换用于将一种数据类型转换为另一种数据类型,通常在以下情况使用:
-
基本类型转换
double price = 9.9;
int intPrice = (int) price; // 强制转换为int,结果为9
-
父子类之间转换
// 向上转型(自动转换)
Animal animal = new Dog();
// 向下转型(需要强制转换)
Dog dog = (Dog) animal; // 必须确保animal实际是Dog类型,否则会抛ClassCastException
-
包装类与基本类型转换
Object obj = 100;
int num = (Integer) obj; // 先转为包装类,再自动拆箱
InstanceOf
是实现多态和类型安全转换的重要工具
-
是一个二元运算符,判断对象是不是某一个类(接口、父类)的实例
-
返回boolean类型
-
左侧是要检测的对象(必须是引用 类型,不能是基本类型)
int num = 10; // 编译错误:基本类型不能用于instanceof System.out.println(num instanceof Integer);
-
右侧是类名或者接口名
-
判断继承关系
class Animal {}
class Dog extends Animal {}
public class Main {public static void main(String[] args) {Animal animal = new Dog();Dog dog = new Dog();System.out.println(animal instanceof Animal); // true(animal是Animal的实例)System.out.println(animal instanceof Dog); // true(animal实际是Dog的实例)System.out.println(dog instanceof Animal); // true(Dog是Animal的子类)}
}
-
类型转换的检查
class Animal {}
class Dog extends Animal {void bark() {System.out.println("汪汪");}
}
public class Main {public static void main(String[] args) {Animal animal = new Dog();// 安全转型:先判断再转换if (animal instanceof Dog) {Dog dog = (Dog) animal; // 向下转型dog.bark(); // 调用子类特有方法}}
}
-
null不是任何类的实例,会返回false
-
接口类型判断
interface Runnable {} class MyThread implements Runnable {} public class Main {public static void main(String[] args) {MyThread thread = new MyThread();System.out.println(thread instanceof Runnable); // true} }
getClass
Animal animal = new Dog();
System.out.println(animal instanceof Animal); // true
System.out.println(animal.getClass() == Animal.class); // false(实际类型是Dog)
new 的谁 类型就是谁