Olá Pessoal, tudo bom?
Continuando nossa descrição básica sobre os operadores no Java, hoje é dia de falar sobre o operador instanceof. A sexta parte desse artigo se encontra aqui. Confira na continuação desse artigo sobre o operador instanceof:
Operador instanceof
Esse operador realiza a comparação do tipo de um objeto com um determinado tipo. Ou seja, é possível utilizar esse operador para testar se um objeto é do tipo de uma classe, uma subclasse, uma interface ou enum:
Operador | Descrição |
---|---|
instanceof | Operador que realiza a comparação de tipos de instâncias de um objeto |
Para conseguir realizar uma classe de exemplo que trabalha com o operador instanceof, temos que criar algumas classes (ClasseMae e ClasseFilha), interface (MinhaInterface) e enum (MeuEnum) para auxiliar:
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 |
package br.com.mauda.operadores; class ClasseMae { } class ClasseFilha extends ClasseMae implements MinhaInterface { } interface MinhaInterface { } enum MeuEnum implements MinhaInterface { MINHA_CONSTANTE_1 } public class OperadorInstanceof { public static void main(String[] args) { ClasseMae obj1 = null; System.out.println("obj1 instanceof Object: " + (obj1 instanceof Object)); System.out.println("obj1 instanceof ClasseMae: " + (obj1 instanceof ClasseMae)); System.out.println("obj1 instanceof ClasseFilha: " + (obj1 instanceof ClasseFilha)); System.out.println("obj1 instanceof MinhaInterface: " + (obj1 instanceof MinhaInterface)); ClasseMae obj2 = new ClasseMae(); System.out.println("\nobj2 instanceof Object: " + (obj2 instanceof Object)); System.out.println("obj2 instanceof ClasseMae: " + (obj2 instanceof ClasseMae)); System.out.println("obj2 instanceof ClasseFilha: " + (obj2 instanceof ClasseFilha)); System.out.println("obj2 instanceof MinhaInterface: " + (obj2 instanceof MinhaInterface)); ClasseMae obj3 = new ClasseFilha(); System.out.println("\nobj3 instanceof Object: " + (obj3 instanceof Object)); System.out.println("obj3 instanceof ClasseMae: " + (obj3 instanceof ClasseMae)); System.out.println("obj3 instanceof ClasseFilha: " + (obj3 instanceof ClasseFilha)); System.out.println("obj3 instanceof MinhaInterface: " + (obj3 instanceof MinhaInterface)); ClasseFilha obj4 = new ClasseFilha(); System.out.println("\nobj4 instanceof Object: " + (obj4 instanceof Object)); System.out.println("obj4 instanceof ClasseMae: " + (obj4 instanceof ClasseMae)); System.out.println("obj4 instanceof ClasseFilha: " + (obj4 instanceof ClasseFilha)); System.out.println("obj4 instanceof MinhaInterface: " + (obj4 instanceof MinhaInterface)); MeuEnum e1 = null; System.out.println("\ne1 instanceof Object: " + (e1 instanceof Object)); System.out.println("e1 instanceof MeuEnum: " + (e1 instanceof MeuEnum)); System.out.println("e1 instanceof MinhaInterface: " + (e1 instanceof MinhaInterface)); MeuEnum e2 = MeuEnum.MINHA_CONSTANTE_1; System.out.println("\ne2 instanceof Object: " + (e2 instanceof Object)); System.out.println("e2 instanceof MeuEnum: " + (e2 instanceof MeuEnum)); System.out.println("e2 instanceof MinhaInterface: " + (e2 instanceof MinhaInterface)); } } |
O resultado da execução dessa classe será o seguinte:
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 |
obj1 instanceof Object: false obj1 instanceof ClasseMae: false obj1 instanceof ClasseFilha: false obj1 instanceof MinhaInterface: false obj2 instanceof Object: true obj2 instanceof ClasseMae: true obj2 instanceof ClasseFilha: false obj2 instanceof MinhaInterface: false obj3 instanceof Object: true obj3 instanceof ClasseMae: true obj3 instanceof ClasseFilha: true obj3 instanceof MinhaInterface: true obj4 instanceof Object: true obj4 instanceof ClasseMae: true obj4 instanceof ClasseFilha: true obj4 instanceof MinhaInterface: true e1 instanceof Object: false e1 instanceof MeuEnum: false e1 instanceof MinhaInterface: false e2 instanceof Object: true e2 instanceof MeuEnum: true e2 instanceof MinhaInterface: true |
Explicação do Exemplo
Esse exemplo necessita de um pouco mais de explicação. Primeiramente criamos uma classe básica chamada ClasseMae e uma filha desta classe ClasseFilha, esta também implementa a interface MinhaInterface. Por fim temos um enum que implementa a interface MinhaInterface também.
Criamos um obj1, do tipo ClasseMae o qual é inicializado com o valor null. Perceba que todos as comparações com o instanceof retornam false. Ou seja, enquanto uma variável for nula, ela nunca será instância de nenhuma classe, interface. Se você verificar a variável e1, a execução desta será igual a da obj1, ou seja, não será instância de nenhum tipo.
Criamos um obj2, do tipo ClasseMae, o qual é inicializado com uma instância de ClasseMae. Essa classe não implementa a interface MinhaInterface e não é ClasseFilha, logo os últimos itens da avaliação do instanceof serão falsos. Lembre-se toda classe e enum extende, mesmo que implicitamente, a classe java.lang.Object, logo todos as instâncias não nulas serão instanceof Object.
O obj3, do tipo ClasseMae, é inicializado com uma instância de ClasseFilha, a qual estende a ClasseMae, logo todas as validações são verdadeiras. O mesmo se aplica para o obj4, só que este objeto é do tipo ClasseFilha.
O enum e1 é inicializado com valor null. Logo nenhuma validação será verdadeira. Já o enum e2 é inicializado com uma constante de MeuEnum, assim todas as validações são verdadeiras.
Caso você tente comparar uma instância de enum com uma classe ou o contrário:
1 |
System.out.println("e1 instanceof ClasseMae: " + (e1 instanceof ClasseMae)); |
Ocorrerá um erro de compilação, com a seguinte mensagem:
Incompatible conditional operand typesMeuEnum and ClasseMae
Precedência dos Operadores
Continuando a formular a tabela de precedência, agora seguem o operador instanceof, o qual está junto com os operadores relacionais, assim verifique a tabela abaixo:
Ordem | Tipo de Operador | Precedência |
---|---|---|
1 | Pós Fixo | expr++ expr– |
2 | Pré fixo e Unário | ++expr –expr +expr -expr ! |
3 | Multiplicativo | * / % |
4 | Aditivo | + – |
5 | Relacional | > >= <= < instanceof |
6 | Igualdade | == != |
7 | AND Lógico | && |
8 | OR Lógico | || |
9 | Atribuição | = += -= *= /= %= |
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply