Java instanceof
运算符
原文:https://www.studytonight.com/java-examples/java-instanceof-operator
在面向对象编程中,对象被定义为类的实例。顾名思义,Java 中的 instanceof 运算符用于检查这种关系。该运算符也称为类型比较运算符。
运算符的实例返回一个布尔值。如果对象是特定类型,则该运算符返回真,否则返回假。该运算符的语法如下所示。
实例的语法
(object) instanceof (class or subclass or interface)
示例:Java 中的实例
instanceof 运算符只需检查对象和类型之间的 is-a 关系。在下面的例子中,我们可以说苹果是水果,但是汽车是车辆而不是水果。
class Fruit{}
class Vehicle{}
public class InstanceofDemo
{
public static void main(String[] args)
{
Fruit pineapple = new Fruit();
Vehicle truck = new Vehicle();
System.out.println("pineapple IS A fruit: " + (pineapple instanceof Fruit));
System.out.println("truck IS A vehicle: " + (truck instanceof Vehicle));
}
}
菠萝是水果:真 卡车是车辆:真
但是如果我们运行下面的代码,那么我们会得到一个编译错误,因为汽车和水果之间没有关系。
class Fruit{}
class Vehicle{}
public class InstanceofDemo
{
public static void main(String[] args)
{
Fruit apple = new Fruit();
Vehicle car = new Vehicle();
System.out.println("car IS A Fruit: " + (car instanceof Fruit));
}
}
示例:带有子类的实例
让我们创建一个父类和一个子类来理解它们之间的关系。子类的对象也是父类的实例。
class A{}
class B extends A{}
public class InstanceofDemo
{
public static void main(String[] args)
{
B objOfClassB = new B();
System.out.println("objOfClassB is an instance of B: " + (objOfClassB instanceof B));
System.out.println("objOfClassB is an instance of the parent class A: " + (objOfClassB instanceof A));
}
}
objOfClassB 是 B 的实例:真 objOfClassB 是父类 A 的实例:真
子类是父类的类型,但事实并非如此。如果我们创建一个父类的对象,并将其与子类进行比较,那么 instanceof 运算符将返回 false 。
class A{}
class B extends A{}
public class InstanceofDemo
{
public static void main(String[] args)
{
B objOfClassB = new B();
A objOfClassA = new A();
System.out.println("objOfClassB is an instance of the parent class A: " + (objOfClassB instanceof A));
System.out.println("objOfClassA is an instance of the child class B: " + (objOfClassA instanceof B));
}
}
objOfClassA 是父类 A 的实例:true objOfClassA 是子类 B 的实例:false
示例:带接口的实例
还要注意,如果子类实现了一个接口,那么如果我们将子类的对象与接口进行比较,instanceof 运算符将返回 true。
class A{}
interface C{}
class B extends A implements C{}
public class InstanceofDemo
{
public static void main(String[] args)
{
B objOfClassB = new B();
System.out.println((objOfClassB instanceof B));
}
}
真
示例:带有对象类的实例
在 Java 中,每个类都扩展了对象类,因此任何对象都是对象类的一个实例。这可以通过使用 instanceof 运算符来验证。
class A{}
interface C{}
class B extends A implements C{}
public class InstanceofDemo
{
public static void main(String[] args)
{
B objOfClassB = new B();
String str = "string";
Exception e = new Exception();
System.out.println((objOfClassB instanceof Object));
System.out.println((str instanceof Object));
System.out.println((e instanceof Object));
}
}
真 真 真
如果对象为空,则实例将始终返回假。
class A{}
interface C{}
class B extends A implements C{}
public class InstanceofDemo
{
public static void main(String[] args)
{
B objOfClassB = null;
System.out.println((objOfClassB instanceof B));
System.out.println((objOfClassB instanceof A));
System.out.println((objOfClassB instanceof C));
System.out.println((objOfClassB instanceof Object));
}
}
假 假 假 假
instanceof 运算符只能用于具体化类型(其信息在运行时可用的类型)。我们不能对泛型类型使用此运算符,因为泛型类型信息在运行时会丢失。下面的代码演示了这个场景。它会给出一个编译错误,说明泛型类型信息在运行时被删除,因此 instanceof 运算符无法处理它。
public static <T> boolean instanceCheck(List<T> list)
{
return list instanceof ArrayList<String>;
}
无法对参数化类型ArrayList
<字符串>执行实例检查。使用表格ArrayList
<?>相反,因为更多的泛型类型信息将在运行时被删除
摘要
instanceof 运算符仅用于检查对象是否是类的实例或类型。它主要用于在尝试访问其数据或方法之前检查对象类型。运算符的实例只是一个is-一个关系检查。如果对象和类型没有任何关系,instanceof 运算符将给出一个编译错误,如果对象为 null,它将始终为 false。