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。