interface C extends A,B { public void cMethod(); }
class D implements B {
public void bMethod() { }
}
class E extends D implements C {
public void aMethod() { }
public void bMethod() { }
public void cMethod() { }
}
What is the result?
A. Compilation fails because of an error in line 3.
B. Compilation fails because of an error in line 7.
C. Compilation fails because of an error in line 9.
D. If you define D e = new E(), then e.bMethod() invokes the version
of bMethod() defined in Line 5.
E. If you define D e = (D)(new E()), then e.bMethod() invokes the
version of bMethod() defined in Line 5.
F. If you define D e = (D)(new E()), then e.bMethod() invokes the
version of bMethod() defined in Line 9.[/code]
Apesar do casting (que aliás é um casting explicito desnecessário neste caso), o objeto não deixa de ser uma instância de E. Logo, em tempo de execução, o método sobrecarregado escolhido é aquele que pertence à classe da instância real (E), e não à classe da referência (D).
D e = new E() (Alternativa D) e D e = (D)(new E()) (alternativa E) são a mesma coisa só que escrito de maneira diferente (O cast no primeiro caso foi implícito e no segundo foi explícito). Então você elimina a alternativa E pela mesma maneira que você elimina a alternativa D.
A F está correta porque em tempo de execução a jvm irá chamar o método da classe que realmente foi instanciada (este caso a classe E)
interface C extends A,B { public void cMethod(); }
class D implements B {
public void bMethod() { }
}
class E extends D implements C {
public void aMethod() { }
public void bMethod() { }
public void cMethod() { }
}
What is the result?
A. Compilation fails because of an error in line 3.
B. Compilation fails because of an error in line 7.
C. Compilation fails because of an error in line 9.
D. If you define D e = new E(), then e.bMethod() invokes the version
of bMethod() defined in Line 5.
E. If you define D e = (D)(new E()), then e.bMethod() invokes the
version of bMethod() defined in Line 5.
F. If you define D e = (D)(new E()), then e.bMethod() invokes the
version of bMethod() defined in Line 9.[/code]
Galera a resposta está a “F”, pq nao é a “E”?[/quote]
(D)(new E());
Você ficou confuso porque não sabia que essa linha de código não altera o objeto para o qual a referência está apontando, apesar de ocorrer um cast.
Opa, a galera ja respondeu mas postei pra dar uma dica
“Toda vez que tiver em duvida sobre o resultado de uma questão, digite o codigo compile e execute para ver o resultado, faça sua implementação do problema para estudar e provavelmente implementando o problema de forma diferente vc jamais ira esquecelo”