Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Herança e Operadores

Given the following class definitions, the expression:

(obj instanceof A) && ! (obj instanceof C) && ! (obj instanceof D) correctly identifies whether the object referred to by obj was created by instantiating
class B rather than classes A, C and D?

class A {}
class B extends A {}
class C extends B {}
class D extends C {}

a) True
b) False

Se eu entendi a pergunta, supondo que obj é uma instância de B e não de A,C ou D, então o resultado dessa expressão retorna true! Mas o gabarito tá oposto.

Alguém pode me explicar ??

3 respostas

Oi Guibson,

Se eu entendi bem a pergunta, ele quer saber se a expressão que ele deu identifica se a classe é uma instância de B, mas não de A, C e D.

No entanto, ela não identifica. Afinal, o instanceof A dá verdadeiro para instâncias de A e de B. Portanto, ela voltará verdadeiro para ambos os casos.

Portanto, a resposta é false. Faz sentido?

solução!

Olá Guibson! A pergunta não quer saber o resultado da expressão. Creio que a pergunta seja:

Dada as definições das classes, a expressão:
(obj instanceof A) && ! (obj instanceof C) && ! (obj instanceof D), identifica corretamente que o objeto referenciado por obj foi criado pela instanciação da classe B e não das classes A, C, D?

class A {}
class B extends A {}
class C extends B {}
class D extends C {}

a) True
b) False

Ou seja, ele quer saber se a expressão consegue identificar se o Objeto é apenas da classe B, ou seja é instanciado pela classe B e não das classes A, C, D.

A resposta então é NÃO (FALSE).

Veja só, existem 4 casos a serem analisados pela expressão, que são:

Caso 1: A obj = new A() (Um Objeto instanciado de A)

Caso 2: B obj = new B() (Um Objeto instanciado de B)

Caso 3: C obj = new C() (Um Objeto instanciado de C)

Caso 4: D obj = new D() (Um Objeto instanciado de D)

Para responder a questão você apenas precisa analisar os dois primeiros casos.

CASO 2: ( B obj = new B() )

(obj instanceof A) = TRUE

! (obj instanceof C) = TRUE

! (obj instanceof D) = TRUE
CASO 1: ( A obj = new A() )

(obj instanceof A) = TRUE

! (obj instanceof C) = TRUE

! (obj instanceof D) = TRUE

Logo, o objeto sendo do caso 2, a expressão retornará TRUE. Porém, o objeto sendo do caso 1, a expressão também retorna TRUE, sendo assim, a expressão dada NÃO consegue identificar se o objeto é somente da classe B, Logo a resposta da questão é FALSE.

Enfim, Espero ter ajudado. Bons Estudos!

Entendi! Acho que a pergunta ficaria mais completa se tivesse dito que o resultado dessa expressão retorna true.. facilitaria o entendimento. Como a questão não falou nada, eu pensei que tava em aberto... por isso pensei q tinha que supor que era B pra ver seu resultado. Mas enfim, excelentes explicações!! Valeu mesmo..