"Overriding is only for methods, not for variables. Variables are always chosen at compilation time,
depending on the declared type of the invoking object. Here the return type of c1.getObject() is class A"
A duvida é a seguinte: Não deveria ser o retorno da class B?
Quando ele fez isso..
CovariantTest c1 = new SubCovariantTest();
no tempo de compilação ele não teria de usar o getObject() do SubCovariant() pela regra do polimorfismo ??
Ele diz que a resposta é 5, mas para no meu ver seria 6...
então… o poliformismo se aplica apenas para MÉTODOS. neste caso vc acessa a variavel x. Então será retornada a variavel referente ao tipo da referencia.
L
leolimas
Tá até a parte do polimorfismo só p/ METODOS eu já tinha entendido, oque eu não entendi é por que retorna o 5 sendo que o getObject do SubCovariantTest retorna uma instancia de B, e a instancia de B que acessa a variavel x.
Não é isso que acontece ?
B b = c1.getObject();
printf(b.x);
o B recebeu o new B() do getObject por conta do polimorfismo, agora eu não entendi o por que do b.x não ser referente a class B…
B
brrodo
aaah, o gustavobs já disse :)…
fabrycyocarvalho
Pelo meu ver acho que vc tem que olhar a quem a varivavel de referencia está referenciando
CovariantTest c1 = new SubCovariantTest();
c1 -> referencia a CovariantTest
então o getObject() chamado será o da Classe CovariantTest que retorna a instancia de A
Abr[]s
gustavobs
é como ele disse …
c1. chama a superclasse…
vai ser criado um objeto A apenas como “ponte” para x… e x de A vale 5.
B
brrodo
gustavobs:
é como ele disse …
c1. chama a superclasse…
vai ser criado um objeto A apenas como “ponte” para x… e x de A vale 5.
O que eu entendi é q o leolimas está dizendo q o método getObject() da classe CovariantTest foi “overrided” pelo método getObject() da subclasse SubCovariantTest, já q esse método retorna um tipo “co-variant” ao da superclasse (B extends A)…Então qd chamasse c1.getObject(), ele iria chamar o método da clase SubCovariantTest que sobrescreveu o da classe CovariantTest, logo, retornando B.
Acho q foi isso q ele quis dizer.
L
leolimas
Isso brrodo!!
E como eu estava me baseando por esse Overrided eu estava descartando que c1 é type CovariantTest, e assumindo que em tempo de execução ela iria se comportar como uma SubCovariantTest(), assim retornando um new B() ao inves de um new A();
Ainda está meio obscuro essa questão, vou estudar um pouco mais sobre essa parada de tipo…
Vlw ai
delegada_ti
Nossa… eu também estou estudando para a certificação Java.
E falando de covariantes de retorno, quem está seguindo o livro SCJP 5 - Segunda Edição, na página 75, há um código errado…
peguei o livro em inglês o correto:
Agora sim, quem for ler vai entender no livro…
public static void main(String[] args){
CovariantTest c1 = new SubCovariantTest();
System.out.println(c1.getObject().x);
}
caso CovariantTest e SubCovariantTest tivessem uma variavel “y” e fosse dado print c1.y certamente vc entenderia que o resultado seria o valor referente a classe do tipo da variavel.
Neste caso é praticamente a mesma coisa, o que esse codigo faz é como se fosse:
public static void main(String[] args){
CovariantTest c1 = new SubCovariantTest();
System.out.println(new A().x);
}
Eu sei que vc acha que seria:
public static void main(String[] args){
CovariantTest c1 = new SubCovariantTest();
System.out.println(new B().x); //ERRADO
}
Quando vc busca uma variavel o valor dela SEMPRE será referente a classe do tipo da referencia.
Pensa no resultado em tempo de compilação, não imagina que é criado o objeto B.