Что такое оператор instanceof, используемый в Java?

Для чего используется оператор instanceof? Я видел такие вещи, как

if (source instanceof Button) {
    //...
} else {
    //...
}

Но ничто из этого не имело смысла для меня. Я сделал свое исследование, но придумал только примеры без каких-либо объяснений.

Ответ 1

instanceof keyword - это двоичный оператор, используемый для проверки, является ли объект (экземпляр) подтипом данного типа.

Представьте себе:

interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}

Представьте объект dog, созданный с помощью Object dog = new Dog(), а затем:

dog instanceof Domestic // true - Dog implements Domestic
dog instanceof Animal   // true - Dog extends Animal
dog instanceof Dog      // true - Dog is Dog
dog instanceof Object   // true - Object is the parent type of all objects

Однако, с Object animal = new Animal();,

animal instanceof Dog // false

потому что Animal является супертипом dog и, возможно, менее "уточненным".

и

dog instanceof Cat // does not even compile!

Это связано с тем, что dog не является ни подтипом, ни супертипом Cat, но также не реализует его.

Обратите внимание, что переменная, используемая для dog выше, имеет тип Object. Это означает, что instanceof является операцией во время выполнения и приводит нас к прецеденту использования: чтобы реагировать по-разному на основе типа объектов во время выполнения.

Замечания: expressionThatIsNull instanceof T является ложным для всех типов T.

Счастливое кодирование.

Ответ 2

Это оператор, который возвращает true, если левая часть выражения является экземпляром имени класса с правой стороны.

Подумайте об этом так. Скажите, что все дома на вашем блоке были построены из тех же чертежей. Десять домов (объектов), один набор чертежей (определение класса).

instanceof - полезный инструмент, когда у вас есть коллекция объектов, и вы не знаете, что это такое. Скажем, у вас есть коллекция элементов управления на форме. Вы хотите прочитать проверенное состояние всех флажков, но вы не можете запросить простой старый объект для его проверенного состояния. Вместо этого вы увидите, есть ли у каждого объекта флажок, и если да, установите его на флажок и проверьте его свойства.

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}

Ответ 3

Как описано на этом сайте:

Оператор instanceof может использоваться для проверки, имеет ли объект определенный тип...

if (objectReference instanceof type)

Быстрый пример:

String s = "Hello World!"
return s instanceof String;
//result --> true

Однако применение instanceof в нулевой ссылочной переменной /expression возвращает false.

String s = null;
return s instanceof String;
//result --> false

Поскольку подкласс является "типом" его суперкласса, вы можете использовать instanceof для проверки этого...

class Parent {
    public Parent() {}
}

class Child extends Parent {
    public Child() {
        super();
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println( child instanceof Parent );
    }
}
//result --> true

Надеюсь, это поможет!

Ответ 4

Если source является переменной object, instanceof является способом проверки, является ли это Button или нет.

Ответ 5

Этот оператор позволяет определить тип объекта. Он возвращает значение boolean.

Например

package test;

import java.util.Date;
import java.util.Map;
import java.util.HashMap;

public class instanceoftest
{
    public static void main(String args[])
    {
        Map m=new HashMap();
        System.out.println("Returns a boolean value "+(m instanceof Map));
        System.out.println("Returns a boolean value "+(m instanceof HashMap));
        System.out.println("Returns a boolean value "+(m instanceof Object));
        System.out.println("Returns a boolean value "+(m instanceof Date));
    }
} 

вывод:

Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false

Ответ 6

Как упоминалось в других ответах, каноническое типичное использование instanceof предназначено для проверки того, относится ли идентификатор к более конкретному типу. Пример:

Object someobject = ... some code which gets something that might be a button ...
if (someobject instanceof Button) {
    // then if someobject is in fact a button this block gets executed
} else {
    // otherwise execute this block
}

Обратите внимание, однако, что тип левого выражения должен быть родительским типом выражения правой руки (см. JLS 15.20.2 и Java Puzzlers, # 50, pp114). Например, следующее не будет скомпилировано:

public class Test {
    public static void main(String [] args) {
        System.out.println(new Test() instanceof String); // will fail to compile
    }
}

Это не скомпилируется с сообщением:

Test.java:6: error: inconvertible types
        System.out.println(t instanceof String);
                       ^
  required: String
  found:    Test
1 error

Поскольку Test не является родительским классом String. OTOH, он отлично компилируется и печатает false, как ожидалось:

public class Test {
    public static void main(String [] args) {
        Object t = new Test();
        // compiles fine since Object is a parent class to String
        System.out.println(t instanceof String); 
    }
}

Ответ 7

Этот оператор используется только для переменных опорных объектов. Оператор проверяет, является ли объект определенного типа (тип класса или тип интерфейса). Оператор instanceof записывается как:

( Object reference variable ) instanceof  (class/interface type)

Если объект, указанный переменной в левой части оператора, передает проверку "IS-A" для класса/типа интерфейса с правой стороны, тогда результат будет прав.

Ответ 8

public class Animal{ float age; }

public class Lion extends Animal { int claws;}

public class Jungle {
    public static void main(String args[]) {

        Animal animal = new Animal(); 
        Animal animal2 = new Lion(); 
        Lion lion = new Lion(); 
        Animal animal3 = new Animal(); 
        Lion lion2 = new Animal();   //won't compile (can't reference super class object with sub class reference variable) 

        if(animal instanceof Lion)  //false

        if(animal2 instanceof Lion)  //true

        if(lion insanceof Lion) //true

        if(animal3 instanceof Animal) //true 

    }
}

Ответ 9

Может использоваться как стенограмма проверки равенства.

Итак, этот код

if(ob != null && this.getClass() == ob.getClass) {
}

Может быть записано как

if(ob instanceOf ClassA) {
}

Ответ 10

Оператор instanceof сравнивает объект с указанным типом. Вы можете использовать его для проверки, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Ответ 11

Экземпляр ключевого слова полезен, когда вы хотите узнать конкретный экземпляр объекта.

Предположим, что вы выбрали исключение, и когда у вас есть улов, выполните обычную операцию суммирования и затем снова продолжайте согласно вашей логике (бросает или регистрирует и т.д.)

Пример: 1) Пользователь создал собственное исключение "InvalidExtensionsException" и выбросил его в соответствии с логикой

2) Теперь в блоке catch catch (Исключение e) {  выполнять логику суммы, если тип исключения - "InvalidExtensionsException"

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3) Если вы не проверяете экземпляр и тип исключения, это исключение Null-указателя, которое ваш код сломает.

Итак, ваша логика должна быть внутри экземпляра   if (e instanceof InvalidExtensionsException) {    InvalidExtensionsException InvalidException = (InvalidExtensionsException) e;   }

Выше приведен пример неправильной практики кодирования. Однако этот пример поможет вам понять использование его экземпляра.

Ответ 12

Большинство людей правильно объяснили "Что" этого вопроса, но никто не объяснил "Как" правильно.

Итак, вот простая иллюстрация:

String s = new String("Hello");
if (s instanceof String) System.out.println("s is instance of String"); // True
if (s instanceof Object) System.out.println("s is instance of Object"); // True
//if (s instanceof StringBuffer) System.out.println("s is instance of StringBuffer"); // Compile error
Object o = (Object)s;
if (o instanceof StringBuffer) System.out.println("o is instance of StringBuffer"); //No error, returns False
else System.out.println("Not an instance of StringBuffer"); // 
if (o instanceof String) System.out.println("o is instance of String"); //True

Выходы:

s is instance of String
s is instance of Object
Not an instance of StringBuffer
o is instance of String

Причина ошибки компилятора при сравнении s с StringBuffer хорошо объясняется в документах:

Вы можете использовать его для проверки, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

что означает, что LHS должен быть либо экземпляром RHS, либо классом, который либо реализует RHS, либо расширяет RHS.

Как использовать use instanceof?
Поскольку каждый класс расширяет Object, тип LHS для создания объектов будет всегда работать в вашу пользу:

String s = new String("Hello");
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //No compiler error now :)
else System.out.println("Not an instance of StringBuffer");

Выходы:

Not an instance of StringBuffer

Ответ 13

Вы можете использовать Map, чтобы сделать более высокую абстракцию в экземпляре

private final Map<Class, Consumer<String>> actions = new HashMap<>();

Затем, имея такое отображение, добавьте к нему какое-то действие:

actions.put(String.class, new Consumer<String>() {
        @Override
        public void accept(String s) {
           System.out.println("action for String");       
        }
    };

Затем, имея объект Неизвестного типа, вы можете получить конкретное действие с этой карты:

actions.get(someObject).accept(someObject)

Ответ 14

class Test48{
public static void main (String args[]){
Object Obj=new Hello();
//Hello obj=new Hello;
System.out.println(Obj instanceof String);
System.out.println(Obj instanceof Hello);
System.out.println(Obj instanceof Object);
Hello h=null;
System.out.println(h instanceof Hello);
System.out.println(h instanceof Object);
}
}  

Ответ 15

Очень простой пример кода:

If (object1 instanceof Class1) {
   // do something
} else if (object1 instanceof Class2) {
   // do something different
}

Будьте осторожны. В приведенном выше примере, если Class1 является Object, первое сравнение всегда будет истинным. Итак, как и с исключениями, имеет значение иерархический порядок!

Ответ 16

Оператор instanceof используется для проверки того, является ли объект экземпляром указанного типа. (класс или подкласс или интерфейс).

instanceof также известен как оператор сравнения типов, поскольку он сравнивает экземпляр с типом. Он возвращает либо true, либо false.

class Simple1 {  
public static void main(String args[]) {  
Simple1 s=new Simple1();  
System.out.println(s instanceof Simple1); //true  
}  
}  

Если мы применим оператор instanceof с любой переменной, которая имеет нулевое значение, она возвращает false.