📜  Java instanceof

📅  最后修改于: 2020-09-26 14:48:57             🧑  作者: Mango

在本教程中,您将在示例的帮助下详细了解Java instanceof 运算符 。

在Java中, instanceof关键字是一个二进制运算符。它用于检查对象是否是特定类的实例。

运算符还检查对象是否是实现接口的类的实例(将在本教程的后面进行讨论)。

instanceof的语法为:

result = objectName instanceof className;

instanceof 运算符的左操作数是对象名称,右操作数是类名称。如果对象是类的实例,则结果为true否则为false


示例1:instanceof

class Main {
    public static void main (String[] args) {
        String name = "Programiz";
        Integer age = 22;

        System.out.println("Is name an instance of String: "+ (name instanceof String));
        System.out.println("Is age an instance of Integer: "+ (age instanceof Integer));
    }
}

输出

Is name an instance of String: true
Is age an instance of Integer: true

在上面的示例中,我们创建了一个String类型的对象名称和另一个Integer类型的对象年龄 。然后,我们使用instanceof 运算符检查名称是否为String类型以及age是否为Integer类型。


在继承中使用instanceof

在继承的情况下, instanceof 运算符用于检查子类的对象是否也是超类的实例。

示例2:继承中的instanceof

class Animal {
}

// Dog class is a subclass of Animal
class Dog extends Animal {
}

class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();

        // checks if d1 is an object of Dog
        System.out.println("Is d1 an instance of Dog: "+ (d1 instanceof Dog));
       
        // checks if d1 is an object of Animal
        System.out.println("Is d1 an instance of Animal: "+ (d1 instanceof Animal));
    }
}

输出

Is d1 is an instance of Dog: true
Is d1 an instance of Animal: true

在上面的示例中, d1DogAnimal类的实例。因此, d1 instanceof Dogd1 instanceof Animal d1 instanceof Dog均为true


对象类

在Java中,所有类都继承自Object类。在Object类的继承过程中不使用extends关键字。这种继承隐式发生在Java中。

示例3:对象类

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("Is d1 an instance of the Object class: "+ (d1 instanceof Object));
        System.out.println("Is a1 an instance of the Object class: "+ (a1 instanceof Object));
   
        System.out.println("Is c1 an instance of the Object class: "+ (c1 instanceof Object));
    }
}

输出

Is d1 an instance of the Object class: true
Is a1 an instance of the Object class: true
Is c1 an instance of the Object class: true

在上面的示例中,我们分别创建了AnimalDogCat类的对象a1d1c1 。我们使用instanceof 运算符检查这些对象a1d1c1是否也是Object类的对象 。输出结果为true所有。

这是因为Object类是java.lang包中定义的根类。所有其他类都是在Java中形成层次结构的Object类的子类。


对象上移和下移

在Java中,子类的对象可以视为超类的对象。这称为向上转换。

Java编译器自动执行向上转换。

示例4:对象上载

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向下转换。


示例5:对象向下转换问题

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; // Downcasting
 
       d1.displayInfo();
   }
}

当我们运行程序时,我们将获得一个名为ClassCastException 。让我们看看这里发生了什么。

在这里,我们创建了超类Animal的对象a1 。然后,我们尝试将a1对象转换为Dog类的对象d1

这引起了问题。这是因为超类Animala1对象也可能引用其他子类。如果我们与一起创建另一个子类 ; 动物可能是 ,也可能是狗,引起歧义。

为了解决这个问题,我们可以使用instanceof 运算符。这是如何做:


示例6:使用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;    // Upcasting

    if (a1 instanceof Dog){
       Dog d2 = (Dog)a1;    // Downcasting
       d2.displayInfo();
    }
  }
}

输出

I am a dog

在上面的示例中,我们使用instanceof 运算符检查a1对象是否是Dog类的实例。仅当a1 instanceof Dog的表达式a1 instanceof Dogtrue时,才进行向下转换。


接口中的instanceof

instanceof 运算符还用于检查类的对象是否也是实现该类的接口的实例。

示例7:接口中的instanceof

interface Animal {
}

class Dog implements Animal {
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("Is d1 an instance of Animal: "+(d1 instanceof Animal));
   }
}

输出

Is d1 an instance of Animal: true

在上面的示例中,我们创建了一个实现Animal接口的Dog类。

然后,创建Dog类的d1对象。我们已经使用instanceof 运算符检查d1对象是否也是Animal接口的实例。