O que é instanceof?

Olá pessoal não entendi o que é esse comando …

Alguém poderia me dar um help ???

abs


class Tree{}
class Pine extends Tree{}
class Oak extends Tree{}
public class p32 
{  public static void main( String[] args ) 
   {  Tree tree = new Pine();

      if( tree instanceof Pine )
      System.out.println( "Pine" );

      if( tree instanceof Tree )
      System.out.println( "Tree" );

      if( tree instanceof Oak )
      System.out.println( "Oak" );

      else System.out.println( "Oops" );
   }
}
1 curtida

É um operador. Compara o tipo de uma variável a uma classe. Para mais informações, dê uma olhada na especificação: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#80289

1 curtida

Para quem aprendeu a programar em Português, “instanceof” pode ser lida como “é um”.

Árvore árvore = new Pinheiro();
se (árvore é um Pinheiro) ...
se (árvore é uma Árvore) ...
se (árvore é um Carvalho) ...
1 curtida

Desculpem ressuscitar o tópico, mas é exatamente minha dúvida. Está correto isso, árvore é um Pinheiro? Não seria ao contrário, Pinheiro é uma árvore?
Este operador é válido somente quando há herança entre classes ou pode ser usando com classes distintas?

oi,

o instanceof pode ser utilizado também para interfaces ou então array

dá uma olhada no link abaixo (inglês) e procure por Instanceof

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.html

No exemplo do thingol, árvore é o nome da variável, que guarda a referência de um Pinheiro. Não está sendo afirmado que árvore é um Pinheiro.

No caso, “árvore instanceof Pinheiro”, verifica se o conteúdo da variável árvore é do tipo Pinheiro.

1 curtida

No caso dele “arvore é um pinheiro” pois arvore eh o nome do objeto Pinheiro que com certeza deve ser subclasse de Arvore.
Fico confuso mesmo o nome (arvore) do objeto Pinheiro… mas isso eh so nomeclatura…

É valido quando ha heranca ou implementacao de interface…
Sempre seguindo a logica “É UM”

fallows

No caso, “árvore instanceof Pinheiro”, verifica se o conteúdo da variável árvore é do tipo Pinheiro.[/quote]
Neste caso seria “pinheiro(Objeto) instanceof Pinheiro” correto? É que ficou confuso o nome da variável “tree” referenciando um objeto Pinheiro.

Obrigado a todos, entendi o conceito. Contudo não entendi onde eventualmente irei usar isto. Alguém pode dar um exemplo prático de quando vou verificar a relação É-UM?

Não acho que seja muito utilizado, mas eis um exemplo:

// Percorre os componentes de um container e limpa os text fields for (Component c : container.getComponents()) { if (c instanceof JTextField) { // Verifica se o componente é um JTextField usando instanceof ((JTextField)c).setText(""); // Se for, limpa o texto } }
Fonte: http://www.guj.com.br/java/216682-pegar-componentes-de-um-jframe#1105939

deixa eu ver se eu entendi…
exemplo:

public class cao { // atributos }

cao doberman = new cao();

um instanceof seria:

boolean resultado; resultado = (doberman instanceof cao);

que retornaria true. ta certo??

1 curtida

Exatamente, pois o objeto referenciado por “doberman” é uma instância da classe cao.
Mas como já foi discutido, isto é mais usado quando se tem herança e deseja-se saber a qual classe da herança o objeto pertence.

1 curtida

[quote=gRoOve]Exatamente, pois o objeto referenciado por “doberman” é uma instância da classe cao.
Mas como já foi discutido, isto é mais usado quando se tem herança e deseja-se saber a qual classe da herança o objeto pertence.[/quote]

Click aqui, o exemplo Explica melhor o uso de instanceof

[code]import java.util.ArrayList;
import java.util.Vector;

public class Main {

public static void main(String[] args) {
Object testObject = new ArrayList();
displayObjectClass(testObject);
}
public static void displayObjectClass(Object o) {
if (o instanceof Vector)
System.out.println(“Object was an instance
of the class java.util.Vector”);
else if (o instanceof ArrayList)
System.out.println(“Object was an instance of
the class java.util.ArrayList”);
else
System.out.println("Object was an instance of the "
+ o.getClass());
}
}[/code]

1 curtida

[quote=gRoOve]Desculpem ressuscitar o tópico, mas é exatamente minha dúvida. Está correto isso, árvore é um Pinheiro? Não seria ao contrário, Pinheiro é uma árvore?
Este operador é válido somente quando há herança entre classes ou pode ser usando com classes distintas?[/quote]

Ele está correto, a árvore é um pinheiro, ele se refere ao tipo da árvore.

Outro exemplo é:

if(cachorro é um pastor alemão){
System.out.println(“Pastor Alemão”);
else if(cachorro é um Labrador){
System.out.println(“Labrador”);
}