Estava fazendo o simulado do Wihizlabs e achei a seguinte questão:
classA{intx=5;}classBextendsA{intx=6;}publicclassCovariant{publicAgetObject(){//Linha 3returnnewA();}publicstaticvoidmain(Stringa[]){Covariantc1=newSubCovariantTest();System.out.println(c1.getObject().x);// Linha 1}}classSubCovariantTestextendsCovariant{publicBgetObject(){// Linha 2returnnewB();}}
O resultado deste codigo é: 5
A minha duvida é: Porque a Linha 1 chama o metodo da linha 3 ao inves do metodo da linha 2, sendo que c1 tem referencia para o metodo contido na classe SubCovariantTest.
Pois tem um erro no código, na linha 2 você colocou :
publicBgetObjectc(){// Linha 2
ao invés de :
publicAgetObject(){// Linha 2
a assinatura esta diferente, portanto não tem sobre-escrita do método. Tente esta mudança e verá que terá como resposta 6.
seduardo
Desculpe-me, mandei a segunda linha errada, tem que ser :
publicBgetObject(){// Linha 2
se colocar
publicAgetObject(){// Linha 2
continua recebendo 5 como resposta.
rodrigo_lm
Acho que estou fazendo confusão mas,
e
Existe sobrescrita de metodo, porque B extende A, logo B é uma covariante de A, então não altera a assinatura do metodo.
O que eu quero saber é porque a JVM chama o metodo da linha 3 sendo que c1 tem referencia para a classe SubCovariantTest, então deveria chamar o metodo na linah 2.
Nossa, acho que estou bobeando em algum ponto, essa esta dificil de entender… :x
seduardo
Na verdade não chama o método da linha 3 não, é um problema de interpretação do encapsulamento. Se vc pegar e exibir qual objeto foi instanciado :
Em ambas assinaturas, vc vai notar que ele está iniciando certo o objeto a partir de B. Porém vc está acessando um atributo, e neste caso ele utiliza o nome da classe para fazer a decisão e não a tabela virtual de sobre-escrita.
Tente o seguinte código:
class A{
private int x = 5;
public int getX() { return x; }
}
class B extends A{
private int x = 6;
public int getX() { return x; }
}
e ao invés de chamar c1.getObject().x chame c1.getObject().getX() vai notar que tudo roda como seria esperado.