1. class TestA {
2. public void start() { System.out.println(?TestA?); }
3. }
4. public class TestB extends TestA {
5. public void start() { System.out.println(?TestB?); }
6. public static void main(String[] args) {
7. ((TestA)new TestB()).start();
8. }
9. }
What is the result?
A. TestA
B. TestB
C. Compilation fails.
D. An exception is thrown at runtime.
Answer: B
Acho que segue o mesmo princípio de instanciar uma classe e apontar para um tipo interface. Valem sempre os métodos da instância (new TestB()).
Veiculov1=newCarro();v1.potencia();//executa em carroVeiculov2=newOnibus();v2.potencia();//executa em onibus
É a minha opinião. Se eu estiver errado, por favor me corrijam…
mario.fts
essa linha
((TestA)newTestB()).start();
pode ser convertida para :
TestAvarTestA=newTestB();varTestA.start();
porque TestB é um TestA.
Em tempo de execução, o Java sabe que varTestA é na verdade um objeto TestB, e chama o método sobreescrito em TestB, ao invés do método original de TestA.
G
guilherme.cq
Obrigado.
L
luizlcfc
Se em questão de conversão (cast) não há problemas, para definir qual método será executado, deve-se olhar qual implementação foi instanciada e a partir dela analisar… Na classe de referência vale apenas verificar o que está exposto para ser executado, na implementação verifica-se como executar.
taaqui
So para completar, se fosse variáveis de instância? ele iria chamar a classe que referência…
class TestA {
int var = 12;
}
public class TestB extends TestA {
int var = 10;
public static void main(String[] args) {
TestA t2 = (TestA) new TestB();
System.out.println(t2.var);
}
}
Resposta: 12
mario.fts
É, neste caso não tem override. só se vc usar métodos.