Иногда тип объекта полезно выяснить во время выполнения. Например, в одном потоке исполнения объекты разных типов моrут формироваться, а в другом потоке исполнения — использоваться.
В таком случае удобно выяснить тип каждого объекта, получаемого в обрабатывающем потоке исполнения. Тип объекта во время выполнения не менее важно выяснить и в том случае, когда требуется приведение типов.
В Java неправильное приведение типов влечет за собой появление ошибки во время выполнения.
Большинство ошибок приведения типов может быть выявлено на стадии компиляции. Но приведение типов в пределах иерархии классов может стать причиной ошибок, которые обнаруживаются только во время выполнения.
Например, суперкласс А может порождать два подкласса: В и С. Следовательно, приведение объекта класса В или С к типу А вполне допустимо, но приведение объекта класса В к типу С ( и наоборот) — неверно. А поскольку объект типа А может ссылаться на объекты типа В и С, то как во время выполнения узнать, на какой именно тип делается ссылка перед тем, как выполнить приведение к типус? Это может быть объект типа А, В или С.
Чтобы заказать ретвиты на посты в Твиттере или лайки к ним же, переходите по предложенной ссылке на надежный сервис SMM. Тут Вы сможете получить высококачественное исполнение услуги, а также максимально возможные оптовые скидки на данный ресурс.
Если это объект типа В, то во время выполнения будет сгенерировано исключение. Для разрешения этого вопроса в Java предоставляется оператор времени выполнения instanceof, который имеет следующую общую форму:
1 |
ссылка_на_объект instanceof тип |
где ссылка_на_объект обозначает ссылку на экземпляр класса, а тип — конкретный тип этого класса. Если ссылка_на_объект относится к указанному типу или может быть приведена к нему, то вычисление оператора instanceof дает в итоге логическое значение true, а иначе — логическое значение false.
Таким образом, оператор instanceof — это средство, с помощью которого программа может получить сведения об объекте во время выполнения. В следующем примере программы демонстрируется применение оператора instanceоf. Больше программ сможете найти на форум программистов java, там сможете задавать любые вопросы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
// Продемонстрировать применение оператора instanceof class A { int i, j; } class B { int i, j; } class C extends A { int k; } class D extends A { int k; } class InstanceOf { public static void main(String args[]) { A a = new A(); B b = new B(); C c = new C(); D d = new D(); if(a instanceof A) { System.out.println("a является экземпляром A"); } if(b instanceof B) { System.out.println("b является экземпляром B"); } if(c instanceof C) { System.out.println("c является экземпляром C"); } if(c instanceof A) { System.out.println("c можно привести к типу A"); } if(a instanceof C) { System.out.println("a можно привести к типу C"); } System.out.println(); // сравнить с порожденными типами A ob; ob = d; // ссылка на объект d System.out.println("ob теперь ссылается на d"); if(ob instanceof D) { System.out.println("ob является экземпляром D"); } System.out.println(); ob = c; // ссылка на c System.out.println("ob теперь ссылается на c"); if(ob instanceof D) { System.out.println("ob можно привести к типу D"); } else { System.out.println("ob нельзя привести к типу D"); } if(ob instanceof A) { System.out.println("ob можно привести к типу A"); } System.out.println(); // все объекты могут быть приведены к типу Object if(a instanceof Object) { System.out.println("a можно привести к типу Object"); } if(b instanceof Object) { System.out.println("b можно привести к типу Object"); } if(c instanceof Object) { System.out.println("c можно привести к типу Object"); } if(d instanceof Object) { System.out.println("d можно привести к типу Object"); } } } |
Эта программа выводит следующий результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
a является экземпляром A b является экземпляром B c является экземпляром C c можно привести к типу A ob теперь ссылается на d ob является экземпляром D ob теперь ссылается на c ob нельзя привести к типу D ob можно привести к типу A a можно привести к типу Object b можно привести к типу Object c можно привести к типу Object d можно привести к типу Object |
Большинство программ не нуждается в операторе instanceof, поскольку типы объектов обычно известны заранее.
Но этот оператор может пригодиться при разработке обобщенных процедур, оперирующих объектами из сложной иерархии классов.