TestKiller Dúvida Questão 19

[code]

  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 [/code]

Letra B??? Alguém pode med dar um forcinha? Desde já agradeço

kra… seguinte…

quando ele chama ((TestA)new TestB()).start() ele está chamando o método start da classe TestB…

mas como assim?

seguinte… TestB subscreve o método start da classe TestA, então
quando temos um novo objeto de TestB, a versão subscrita é chamada.

Ele criou uma instância da classe B e fez o cast da mesma para a ClasseA e invocou o método start que a classeB sobrescrevia

Note que isso só é possivel pois a classeB herda da CLasse A, vc pode tentar declarar métodos diferentes am ambas as classes pra ver como funciona

Se vc cria um objeto da classeA e instância como a classeB, esse objeto da classeA terá todas as caracteristicas da classeB, mas só os métodos que a classe A possui

os que não tem na classe A serão perdidos

Isso é uma chamada polimórfica.

Usando uma variável de referência Pai(TestA) para um objeto Filho(TestB).

Como a classe filha TestB sobrescreveu o método herdado start() este será selecionado.

No tempo de execução o método será selecionado dinâmicamente baseado no tipo real do objeto, ou seja, o que foi criado após new.

Espero ter ajudado.

Bom dia Jovens,

Só para reforçar, “leve em consideração o objeto criado”, que no nosso caso é new TestB().
Esse exercício confunde devido ao “cast” (TestA), mas "sempre tenha em mente que o que vale é o “objeto criado”.

Mas gente boa, não tinha que rolando um “upCast” ??? para a class TestA e logo o método da classe A?

Um abração pra todos

Mesmo vc fazendo o cast, teve a implementação da classe B

É igual se vc fizesse

ClassA classe = new ClasseB();

Vc só veria os métodos da ClassA, mas eles teriam a implementação da ClassB

Pois é zoren , mas você esta se referindo ao “downcast” o que entendi. Mas o problema é parace que esta fazendo “upcast” e é essa minha dúvida. :cry:

Um abração pra vocÊ