Mais uma do TestKiller

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

alguem poderia me explicar???

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()).

Veiculo v1 = new Carro();
v1.potencia();//executa em carro

Veiculo v2 = new Onibus();
v2.potencia();//executa em onibus

É a minha opinião. Se eu estiver errado, por favor me corrijam…

essa linha

((TestA)new TestB()).start();

pode ser convertida para :

TestA varTestA = new TestB();
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.

Obrigado.

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.

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

É, neste caso não tem override. só se vc usar métodos.

mas se fosse assim:


public class Teste {

	public static void main(String[] args) {
		TestA t2 =  new TestB();
		System.out.println(t2.var);
		System.out.println(((TestB)t2).var);
		System.out.println(t2.getVar());
		
	}

}

class TestA {
	int var = 12;

	//com método get
	public int getVar() {
		return var;
	}
	
	
}

class TestB extends TestA {
	public int var = 10;
	
	public int getVar() {
		return var;
	}
}

a saída será
12
10
10

se fosse assim:


public class Teste {

	public static void main(String[] args) {
		TestA t2 =  new TestB();
		System.out.println(t2.var);
		System.out.println(((TestB)t2).var);
		System.out.println(t2.getVar());
		
	}

}

class TestA {
	int var = 12;

	public int getVar() {
		return var;
	}
	
	
}

class TestB extends TestA {
	public int var = 10;

	//sem método get

}

a saída será
12
10
12

Por isso que eu adoro Java. :stuck_out_tongue: