在本教程中,您将在示例的帮助下详细了解Java instanceof运算符。
在Java中,instanceof关键字是二进制运算符。它用于检查对象是否是特定类的实例。
运算符还检查对象是否是实现接口的类的实例(将在本教程后面讨论)。
instanceof的语法为:
result = objectName instanceof className;
instanceof运算符的左操作数是对象名,右操作数是类名。如果对象是类的实例,则结果为true;如果不是,则为false。
class Main { public static void main (String[] args) { String name = "nhooo"; Integer age = 22; System.out.println("name是String的实例吗: "+ (name instanceof String)); System.out.println("age是Integer的实例吗: "+ (age instanceof Integer)); } }
输出:
name是String的实例吗: true age是Integer的实例吗: true
在上面的示例中,我们创建了一个String类型的对象name和另一个Integer类型的对象age。 然后,我们使用instanceof运算符检查名称是否为String类型以及age是否为Integer类型。
在继承的情况下,instanceof运算符用于检查子类的对象是否也是超类的实例。
class Animal { } //Dog类是Animal的子类 class Dog extends Animal { } class Main { public static void main(String[] args){ Dog d1 = new Dog(); //检查d1是否是Dog的对象 System.out.println("d1是Dog的实例吗: "+ (d1 instanceof Dog)); //检查d1是否是Animal的对象 System.out.println("d1是Animal的实例吗: "+ (d1 instanceof Animal)); } }
输出:
d1是Dog的实例吗: true d1是Animal的实例吗: true
在上面的示例中,d1是Dog和Animal类的实例。 因此,d1 instanceof Dog 和 d1 instanceof Animal 都为true。
在Java中,所有类都继承自Object类,继承Object类不使用extends关键字。这种继承在Java中隐式发生。
class Animal { } class Dog { } class Cat { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = new Animal(); Cat c1 = new Cat(); System.out.println("d1是Object类的实例吗: "+ (d1 instanceof Object)); System.out.println("a1是Object类的实例吗: "+ (a1 instanceof Object)); System.out.println("c1是Object类的实例吗: "+ (c1 instanceof Object)); } }
输出:
d1是Object类的实例吗: true a1是Object类的实例吗: true c1是Object类的实例吗: true
在上面的实例中,我们分别创建了类Animal、Dog和Cat的对象a1、d1和c1。我们已经使用instanceof操作符来检查这些对象a1, d1, c1是否也是Object类的对象。输出结果都为true(真)。
这是因为Object类是java.lang包中定义的根类。 所有其他类都是在Java中形成层次结构的Object类的子类。
在Java中,子类的对象可以视为父类的对象。这称为向上转型。通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
Java编译器自动执行向上转型。
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; a1.displayInfo(); } }
输出:
I am an animal.
在上面的实例中,我们创建了Dog类的对象d1。我们使用d1对象来创建Animal类的对象a1。这在Java中称为向上转型。
该代码执行没有任何问题。这是因为向上转型是由Java编译器自动完成的。
向下转型是向上转型的相反过程,也就是与向上转型相反,即是把父类对象转为子类对象。
在向下转型的情况下,父类的对象被视为子类的对象。我们必须在Java中显式地指示编译器向下转型。
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Animal a1 = new Animal(); Dog d1 = (Dog)a1; // 向下类型转换 d1.displayInfo(); } }
运行程序时,将获得名为的异常ClassCastException。让我们看看这里发生了什么。
在这里,我们创建了一个父类Animal的对象a1。然后我们尝试将a1对象强制转换为子类Dog的对象d1。
这引起了问题。 这是因为父类Animal的a1对象也可能引用其他子类。 如果我们与Dog一起创建了另一个子类Cat; 动物可能是猫,也可能是狗,引起歧义。
为了解决这个问题,我们可以使用instanceof运算符。这是如何做:
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; // 向上转型 if (a1 instanceof Dog){ Dog d2 = (Dog)a1; // 向下转型 d2.displayInfo(); } } }
输出:
I am a dog
在上面的示例中,我们使用instanceof运算符检查a1对象是否为Dog类的实例。仅当表达式a1 instanceof Dog为true时才进行向下类型转换。
instanceof运算符还用于检查类的对象是否也是实现该类的接口的实例。
interface Animal { } class Dog implements Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); System.out.println("d1对象是Animal的实例吗: "+(d1 instanceof Animal)); } }
输出:
d1对象是Animal的实例吗: true
在上面的示例中,我们创建了一个Dog实现Animal接口的类。
然后,创建Dog类的对象d1。我们已经使用instanceof运算符来检查d1对象是否也是Animal接口的实例。