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
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.
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);
}
}
É, 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
}