Duvida instanceof

12 respostas
Murillo_Pontes

Bom dia!

Pessoal estou estudando para certificação e não estou entendendo a palavra chave instanceof.
Esta palavra chave verifica se um objeto é uma instancia de uma classe tipo:

String nome = “Murillo”

nome instanceof String; //Vai retornar true pois nome é uma instancia da classe String correto??

Agora pouco estava tentando descobrir de qual classe um jInternalFrame pertence. (Pesquisei aqui é vi que esta classe é uma subclasse de JComponent)

mas se eu tentar fazer uma comparação com instanceof deste tipo:

JInternalFrame teste = new JInternalFrame(); if (teste instanceof jFrame) { //codigos aqui }

Tenho erro de compilação

Mas se eu comparar desta maneira:

JInternalFrame teste = new JInternalFrame(); if (teste instanceof jComponent) { //codigos aqui }

Tudo bem sem erros de compilação.

Eu não estou entendendo por que o primeiro caso eu tenho um erro, não era apenas para retornar false???

12 Respostas

evertonsilvagomesjav

vc ja tentou verificar um Integer com uma String?

dev.rafael

Isso é fácil kra! Isso acontece pq JInternalFrame é subclasse de JComponent mas ñ de JFrame. Basta vc dar uma olhada na documentação:

java.lang.Object
+- java.awt.Component
+-- java.awt.Container
+--- javax.swing.JComponent
+---- javax.swing.JInternalFrame

Entendeu?

adriano_si

Cara… estranho dá erro, Posta o stack do erro pra podermos te ajudar melhor…

Jesuino_Master

dev.rafael:
Isso é fácil kra! Isso acontece pq JInternalFrame é subclasse de JComponent mas ñ de JFrame. Basta vc dar uma olhada na documentação:

java.lang.Object
+- java.awt.Component
+-- java.awt.Container
+--- javax.swing.JComponent
+---- javax.swing.JInternalFrame

Entendeu?

Mas por que simplesmente o comando não retorna false invés de dar uma exceção? Acho que esta é a dúvida dele…

Murillo_Pontes

Adriano o erro da em tempo de execução não na compilação:

Exception in thread AWT-EventQueue-0 java.lang.RuntimeException: Uncompilable source code - cannot find symbol

symbol:   class jFrame

location: class formularioPrincipal.TelaPrincipal

at formularioPrincipal.TelaPrincipal.internalFrameContatos(TelaPrincipal.java:162)

at formularioPrincipal.TelaPrincipal.jButtonCadastroActionPerformed(TelaPrincipal.java:129)

at formularioPrincipal.TelaPrincipal.access$000(TelaPrincipal.java:26)

at formularioPrincipal.TelaPrincipal$1.actionPerformed(TelaPrincipal.java:67)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6267)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6032)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2478)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

E que estou usando um IDE e confundi, a IDE me avisa que tem um erro:

cannot find symbol:
class jFrame

Murillo_Pontes

Jesuino Master:
dev.rafael:
Isso é fácil kra! Isso acontece pq JInternalFrame é subclasse de JComponent mas ñ de JFrame. Basta vc dar uma olhada na documentação:

java.lang.Object
+- java.awt.Component
+-- java.awt.Container
+--- javax.swing.JComponent
+---- javax.swing.JInternalFrame

Entendeu?

Mas por que simplesmente o comando não retorna false invés de dar uma exceção? Acho que esta é a dúvida dele…

Isto mesmo Jesuino!!!

evertonsilvagomesjav

Como assim cara isso da erro de compilação.

JInternalFrame teste = new JInternalFrame();
		
		if(teste instanceof JFrame){
			
			System.out.println("só");
			
		}
dev.rafael

Desculpe eu ñ a parte sobre a exceção. Aparentemente a JVM ñ está reconhecendo o simbolo jFrame o q faz muito sentido pq esse tipo ñ existe (a menos q vc o tenha criado). A swing possui um tipo JFrame (com J maiusculo). Mas como já foi citado esse é um erro e compilação e ñ de runtime. Posta ai seu código p/ q possamos dar uma olhada e tentar descobrir a origem do problema.

E

É que o Eclipse, em vez de simplesmente não gerar o .class quando há um erro de compilação, resolve gerar um class de qualquer maneira, e deixa o abacaxi para você descascar mais tarde - ou seja, um erro de execução (que deveria ter sido interpretado como um erro de compilação).

Se você é como eu e odeia tais erros estúpidos (que deveriam ter sido reportados antes), mude as opções do seu projeto:

Window -> Preferences -> Java -> Compiler -> Errors/Warnings
Marque:
[X] Treat errors like fatal compiler errors (make compiled code not executable)


thiagocg

Esse jFrame seria o JFrame do swing?

Parece bobo mas o j ta minusculo!

[]'s

R

Assim compila:

Object teste = new JInternalFrame();  
		    if (teste instanceof JFrame) {  
		    //codigos aqui  
		    }

Ou seja,vc só pode usar o instanceof testando o objeto comparado contra uma classe hierarquicamente inferior

Mas concordo contigo que devia apenas retornar false em vez de dar erro.

Murillo_Pontes

Pessoal obrigado a todos que estão ajudando, mas vamos lá

1º) o meu JFrame da comparação realmente esta com letra minuscula “jFrame” erro muito idiota, mas mesmo que eu altere não é possivel fazer a comparação ele ainda da erro de compilação

2º) como estou fazendo uma aplicação simples para mostrar o uso de componentes swing na semana de tecnologia da minha faculdade, estou utilizando o netbeans, no eclipse ja tinha passado pelo mesmo problema (erros estupidos) e feito a alteração que nem lembrava mais vlw… Entretanto no netbeans não estou encontrando esta opção.

3º) Como assim raf4ever? quer dizer que se eu tiver um objeto jInternalFrame() eu so posso compara-lo com suas superclasses?? Que coisa de loko não?? e aproveitando o seu exemplo o que esta linha de seu codigo faz:

Object teste = new JInternalFrame(); // Ele cria um objeto da classe object?? não consegui entender esta declaração. Sei que todas os objetos extendem a classe Object mas neste caso não entendi!!!

Desculpa as duvidas besta mas tb estou estudando para certificação então é melhor entender tudo claramente né, até as coisas mais simples.
Obrigado

Criado 20 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 12
Participantes 8