Java. Оператор instanceof. Визначення типу об’єкту. Приклади

Оператор instanceof. Визначення типу об’єкту. Приклади


Зміст


Пошук на інших ресурсах:




1. Призначення оператора instanceof. Загальна форма

Оператор instanceof використовується для визначення типу об’єкту під час виконання програми. Визначивши тип об’єкту можна реалізувати коректне приведення типів у випадку, коли класи утворюють ієрархію. Якщо виконати некоректне приведення до деякого типу, то на етапі виконання буде згенерована виключна ситуація, що є неприйнятним.

Загальна форма оператора instanceof наступна

reference instanceof type

тут

  • reference – посилання на об’єкт (екземляр) класу;
  • type – тип класу.

Результатом роботи оператора instanceof є значення true або false. Результат true повертається у випадках:

  • якщо посилання reference відноситься до вказаного типу;
  • якщо посилання reference може бути приведене до вказаного типу.

В інших випадках повертається значення false.

 

2. Застосування instanceof для класів, що утворюють ієрархію. Приклад

У прикладі демонструється коректне визначення типу, до якого належить об’єкт класу. Реалізовано два класи A та B, які утворюють ієрархію. З метою демонстрації визначається тип відповідного об’єкту з врахуванням того, що успадкований клас розширює можливості суперкласу.

// Оператор instanceof
// Суперклас A
class A {
  int a;   
}

// Клас B – успадковує клас A
class B extends A {
  int b;
}

public class TestInstanceOf {

  public static void main(String[] args) {
    A objA = new A();
    B objB = new B();

    if (objA instanceof A)
      System.out.println("objA is a instance of A");
    else
      System.out.println("objA is not an instance of A");

    if (objA instanceof B)
      System.out.println("objA can be cast to type B");
    else
      System.out.println("objA can not be cast to type B");

    if (objB instanceof A)
      System.out.println("objB can be cast to type A");
    else
      System.out.println("objB can not be cast to type A");

    if (objB instanceof B)
      System.out.println("objB is a instance of B");
    else
      System.out.println("objB is not an instance of B");
  }
}

Результат роботи програми

objA is a instance of A
objA can not be cast to type B
objB can be cast to type A
objB is a instance of B

Як видно з результату, екземпляр успадкованого класу B може бути коректно приведений до суперкласу A. А от екземпляр суперкласу A не може бути розширений до можливостей успадкованого класу B.

 

3. Застосування instanceof для типу Object. Приклад

В об’єктній моделі мови Java всі створювані класи успадковані від класу Object. У нижченаведеному прикладі доводиться це твердження.

// Оператор instanceof
// Суперклас A
class A {
  int a;   
}

// Підклас
class B extends A {
  int b;
}

public class TestInstanceOf {

  public static void main(String[] args) {

    A objA = new A(); // екземпляр класу A
    B objB = new B(); // екземпляр класу B

    // Перевірка на успадкування від Object
    if (objA instanceof Object)
      System.out.println("objA can be cast to type Object");
    else
      System.out.println("objA can not be cast to type Object");

    if (objB instanceof Object)
      System.out.println("objB can be cast to type Object");
    else
      System.out.println("objB can not be cast to type Object");
  }
}

Результат роботи програми

objA can be cast to type Object
objB can be cast to type Object

 

4. Застосування instanceof для посилання на базовий клас. Приклад

Якщо класи утворюють ієрархію успадкування, то посилання на суперклас може отримувати значення екземплярів будь-якого похідного класу. У прикладі нижче демонструється визначення того, чи може посилання на суперклас бути приведене до типу похідного класу.

// Оператор instanceof
// Суперклас A
class A {
  int a;   
}

// Підклас B
class B extends A {
  int b;
}

// Підклас C
class C extends B {
  int c;
}

// Підклас D
class D extends C {
  int d;
}

public class TestInstanceOf {

  public static void main(String[] args) {

    // екземпляри класів A, B, C, D
    A objA = new A();
    B objB = new B();
    C objC = new C();
    D objD = new D();

    // посилання на суперклас A
    A refA;

    // Посиланню на суперклас можна присвоювати значення
    // екземплярів (посилань на екземпляри) похідних класів
    refA = objA;

    if (refA instanceof A)
      System.out.println("refA is an instance of A");
    else
      System.out.println("refA is not an instance of A");

    // Перенаправити посилання на екземпляр objB
    refA = objB;
    if (refA instanceof B)
      System.out.println("refA can be cast to type B");
    else
      System.out.println("refA can not be cast to type B");

    if (refA instanceof D)
      System.out.println("refA can be cast to type D");
    else
      System.out.println("refA can not be cast to type D");

    // Посилання на objC
    refA = objC;
    if (refA instanceof B)
      System.out.println("refA can be cast to type B");
    else
      System.out.println("refA can not be cast to type B");
  }
}

Результат роботи програми

refA is an instance of A
refA can be cast to type B
refA can not be cast to type D
refA can be cast to type B

 


Зв’язані теми