Instanceof

11 respostas
M

essa ai é ficha… mas ta valendo, sem rodar, qual é a saída desse código? da pau? compila? imprime algo?

public abstract class Test {

	public static void main( String[] args ) 
	{
		String a = null;
		
		if ( null instanceof String )
			System.out.println( "null" );
		
		if ( a instanceof String )
			System.out.println( "a" );
	}
		
}

11 Respostas

P

Compila e executa, porem não imprimi nada, pois

no primeiro if é verificado se null é uma instancia da classe String, null não é uma instancia … muito menos instancia de String

no segundo if é verificado se a é uma instancia de String, a é uma variavel de referencia para String porem não esta referenciando nenhuma String por isso é retornado false para o if

Bom acho que é isso…

S

quanto ao a é instancia de String, isso retornaria verdadeiro,
mas para mim isso nao compila, devido ao:

null instanceof String

pois quando usamos o instanceof os operadores precisam de algum modo ser um subclasse do outro (nao importa qual), a menos que o operador da direita seja uma interface (ai nao da erro de compilação).

P

"quanto ao a é instancia de String, isso retornaria verdadeiro, "
nenhum instancia foi atribuida a variavel de referencia a da classe String, por isso instanceOf retorna false

O “operador” instanceOf verifica se um determinado objeto é uma instancia de uma classe qualquer, fazendo o teste É-UM , onde

Objeto instanceOf Classe

null é uma variavel especial em Java…
Tudo em java é objeto… exceto dados primitivos (int,long,etc)

logo a condição null instanceOf String não gera exceptions e codigo compila e executa…

J

“psilva”:
"quanto ao a é instancia de String, isso retornaria verdadeiro, "
nenhum instancia foi atribuida a variavel de referencia a da classe String, por isso instanceOf retorna false

O “operador” instanceOf verifica se um determinado objeto é uma instancia de uma classe qualquer, fazendo o teste É-UM , onde

Objeto instanceOf Classe

null é uma variavel especial em Java…
Tudo em java é objeto… exceto dados primitivos (int,long,etc)

logo a condição null instanceOf String não gera exceptions e codigo compila e executa…

Ótima sua explicação…

É isso ae… só uma correção… null não é uma variavel, e sim uma palavra chave, que indica que um objeto não tem nenhuma referência… blz? :wink:

L

[color=“darkblue”]Li num livro de certificação que o operando direito do operador instanceof não pode ser nem java.lang.Class e nem String. Percebo que vocês estão utilizando o String. Já viram algum comentário desse tipo?[/color]

ass.: Leonardo Melo Santos
:wink:

S

“leonardomelosantos”:
[color=“darkblue”]Li num livro de certificação que o operando direito do operador instanceof não pode ser nem java.lang.Class e nem String. Percebo que vocês estão utilizando o String. Já viram algum comentário desse tipo?[/color]

ass.: Leonardo Melo Santos
:wink:

Pode ser usado sim, cara. Mas lembre-se o objeto (à esquerda) e a classe (à direita) devem pertencer à mesma hierarquia, ou dará erro na compilação.
E String e Class são final - pode ter uma pegadinha do tipo:
class A extends String :slight_smile:

F

“leonardomelosantos”:
[color=“darkblue”]Li num livro de certificação que o operando direito do operador instanceof não pode ser nem java.lang.Class e nem String. Percebo que vocês estão utilizando o String. Já viram algum comentário desse tipo?[/color]

ass.: Leonardo Melo Santos
:wink:

Me diga o nome do livro e o autor pra eu não comprar … hehehe
tanto java.lang.Class quanto String podem estar sendo usados como “ReferenceType” (comparação depois do operador instanceof).

Vamos as regras!

Consideramos primeiro:

RelationalExpression instanceof ReferenceType

1 O Operador instanceof só pode comparar tipos de referências ou null, não pode ser primitivos ,porque senão dá erro de compilação.
Ex.:

1. int i=0;
2. boolean b = i instanceof int;

Isso gera um erro de compilação, instanceof só com objetos.

2 “ReferenceType” (O tipo que vem depois do operador) instanceof só pode ser tipo aplicados a referências e não instâncias, senão gera erro

3 Em runtime o instanceof retornará true se o “RelationalExpression” (valor do lado esquerdo) não é null e se essa referência pode ser feito o cast para o “ReferenceType” sem gerar ClassCastException
Senão o resultado é false

Ex.:

class ABC{}
class XYZ{}
class KWY extends ABC{}
class run {
 public static void main(String[] args) {
   ABC abc = new ABC();
   XYZ xyz = new XYZ();
   KWY kwy = new KWY();
   boolean b1 = abc instanceof ABC;//OK! a instancia eh a propria classe;
   boolean b2 = abc instanceof XYZ; //ERRO, não é válido fazer cast de abc para XYZ
   boolean b3 = kwy instanceof ABC; //OK! Eh valido Ex.: ABC a = (ABC)kwy;
   boolean b4 = kwy instanceof XYZ; //ERRO, não é válido fazer cast de kwy para XYZ
   boolean b5 = null instanceof ABC; // null eh sempre false
 }  
}
W

Olá galera!!!

Ficou uma dúvida ainda. O operador instanceof só pode ser usado entre uma referencia e um tipo que pertençam a mesma hierarquia?

Ex.: Color c = new Color();

if ( c instanceof Font ) {

System.out.println(true);

}

else {

System.out.println(false);

}

Essa comparação apenas retornaria false ou ocorreria um erro de compilação??

F

“WagnerPaz”:
Olá galera!!!

Ficou uma dúvida ainda. O operador instanceof só pode ser usado entre uma referencia e um tipo que pertençam a mesma hierarquia?

Ex.: Color c = new Color();

if ( c instanceof Font ) {

System.out.println(true);

}

else {

System.out.println(false);

}

Essa comparação apenas retornaria false ou ocorreria um erro de compilação??

Sim … você deve saber se Font f = (Font)c; pode ser feito,se puder entao não dá erro de compilação, mas não significa que seja true a comparação. Será true se a instância pertencer a família de hieraquia das classes ,e se essa instância passar no teste E-UM .

No seu exemplo, vc deve saber como é a hierarquia de classes das envolvidas na comparacao…

Color e Font não fazem parte de uma ramo comum na hierarquia de classes.

Color public class Color implements Paint, java.io.Serializable

Font public class Font implements java.io.Serializable

Ou seja , não passa no teste E-UM

Ps.: A classe Color não aceita construtor sem argumento! :wink:

W

Foi mal o Color() aew… auHAUh só criei um exemplo rápido e nem me toquei disso 8O hehe

Bom… essa parte eu intendi. Mas em que casos o instanceof retornaria false?

S

Um exemplo:

Object o = Color.RED; System.out.println(o instanceof JFrame);

instanceof é muito usado na implementação do método equals()

Criado 13 de julho de 2004
Ultima resposta 14 de mar. de 2005
Respostas 11
Participantes 8