Dúvida em stanceof  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline



Pra mim era para dar erro na linha 20, já que é impossível b ser uma instância de Fish. Alguém pode me explicar porque não gera erro de compilação na linha 20?

This message was edited 1 time. Last update was at 13/02/2010 11:54:07


Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

O instanceof serve só para perguntar se o objeto é instancia de uma determinada classe. Logo não teria porque da erro, simplesmente o print da linha 20 não será impresso.

This message was edited 1 time. Last update was at 13/02/2010 12:02:39


Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

renzonuccitelli wrote:O instanceod serve só para perguntar se o objeto é instancia de uma determinada classe. Logo não teria porque da erro, simplesmente o print da linha 20 não será impresso.


Vc quer dizer que ele não funciona com interfaces?

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

Serve com interfaces tb. Se a classe implementar a interface, ou uma de suas ancestrais implementar, o instanceof retorna true.

Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

Ainda não entendi...

Tipo, o seguinte código gera erro de compilação:



Por que entao no meu primeiro exemplo o compilador tambem nao detecta?

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

porq no primeiro exemplo vc está utilizando interfaces....
quando vc compara com uma interface não dará erro de compilação porq a classe poderá estar implementando a interface de forma indireta....

This message was edited 1 time. Last update was at 13/02/2010 12:51:58

andeb
Thread.start()

Membro desde: 17/05/2009 21:01:04
Mensagens: 47
Localização: Blumenau
Offline

vmsb11 wrote:porq no primeiro exemplo vc está utilizando interfaces....
quando vc compara com uma interface não dará erro de compilação porq a classe poderá estar implementando a interface de forma indireta....


Não é bem isso, isso aqui também não compila:


A resposta é simples e você já disse, não compila por que String em nenhum hipótese pode ser um Fish, afinal ele é final...
Não tem como mudar a árvore, mude o Bluegill para final também que você vai ter o erro de compilação.

O exemplo abaixo é válido e o instance of retorna true.



Agora sim, através de polimorfismo podemos dizer que Bluegill é sim um Fish.

Ok?

"it's not what you know, it's when you know it"
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

andeb, quer dizer que só ocorre erros de compilação no instanceof quando vc está fazendo qualquerReferenciaDeQualquerClasseSejaEstaFinalOuNao instanceof AlgumaCoisaFinalAqui ou algumacoisafinalaqui instanceof QualquerClasseOuInterfaceSejaElaFinalOuNao ??? É isso?

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
andeb
Thread.start()

Membro desde: 17/05/2009 21:01:04
Mensagens: 47
Localização: Blumenau
Offline

Nesse caso, a recíproca é verdadeira hehe
Não importa em qual lado vai estar o final, o compilador vai acusa como erro quando não for possível, em hipótese nenhuma, que a condição seja verdadeira. Quando uma classe não é final, ela pode ser extentida e/ou implementado por outra que faça a condição ser verdadeira.

"it's not what you know, it's when you know it"
Leonardo3001
GUJ Ranger

Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline

Imagine a seguinte situação:



Só vai dar erro de compilação quando o tipo da variável t não for "pai" (ou "avô", ou "bisavô"...) de MinhaClasse, porque aí, é obvio que não há a possiblidade de ser verdadeiro. Ou melhor dizendo: é erro quando as classes TipoQualquer e MinhaClasse não são da mesma árvore da hierarquia de classes.

Agora, com interfaces, a coisa muda de figura, porque não existe qualquer relação de hierarquia entre classe e interface. Suponha a seguinte situação:



Talvez TipoQualquer não implemente MinhaInterface. Mas quem garante que filhos de TipoQualquer (que podem ser atribuídos à variável t) não resolva implementar essa interface? Ninguém! Por isso que o compilador não pode fazer nada! No primeiro exemplo ali de cima, não tem como um filho de TipoQualquer herdar de MinhaClasse, não existe herança múltipla!

This message was edited 1 time. Last update was at 13/02/2010 15:32:02


Leonardo Veríssimo
-------------------------------------------------
Objectzilla
[WWW]
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

Leonardo3001, por esse seu racioncínio, não tem como afirmar que sempre que você estiver fazendo x instanceof InterfaceQualquerAqui e x se referir à uma classe não final, não iremos ter um erro de compilação?

This message was edited 2 times. Last update was at 13/02/2010 17:32:40


Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
Leonardo3001
GUJ Ranger

Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline

TiagoTC wrote:Leonardo3001, por esse seu racioncínio, não tem como afirmar que sempre que você estiver fazendo x instanceof InterfaceQualquerAqui e x se referir à uma classe não final, não iremos ter um erro de compilação?


O que estou dizendo é: se eu estiver fazendo


, onde x refere-se a uma classe não-final, nunca iremos ter erro de compilação.

Leonardo Veríssimo
-------------------------------------------------
Objectzilla
[WWW]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team