Fale ataufo, isso não é idiota não! São as famosas pegadinhas e é muitíssimo importante postar esse tipo de questão!
A variáveis são “escolhidas” em tempo de compilação enquanto os método em tempo de execução. É o que acontece no polimorfismo
Note esta declaração
Quando a variável ga faz ga.i está se referindo a variável da classe Teste(i=1) porque ga foi declarado Teste ga e as variáveis são “escolhidas” em tempo de compilação. Mas quando ga usa o método getI() usa a referência da classe Arabik que “aponta” para i=2, pois os métodos são escolhidos em tempo de execução.
Um abração
Boa prova pra você
robinsonbsilva
Bom dia jovens,
Recentemente retomei os estudos visando a SCJP.
E realmente esse exemplo é de “fazer a gente pensar”…
O polimorfismo só ocorre para métodos né??
publicclassTeste{inti=1;Teste(){}publicintgetI(){System.out.print("Super");returni;}publicstaticvoidmain(Stringarhs[]){Testega=newArabik();System.out.print(ga.i+" "+ga.getI());//ga.i ...atributo i da referencia a super classe Teste//ga.getI() ....método sobrescrito!!}}classArabikextendsTeste{inti=2;Arabik(){}publicintgetI(){//////SOBRESCREVO O MÉTODOSystem.out.print("Sub");returni;}}
emmanuelrock
E pq primeiro é listado o conteúdo do método ao invés do atributo, sendo que a chamada ao atributo e feita primeiro?
B
bKn
A variável ga.i é avaliada primeiro, mas como a expressão não está completa ela ainda não é imprimida. Ao avaliar o método, é imprimido “Sub” e retornado 2. Agora sim a expressão vai estar completa e vai imprimir “1 2”.
Perfeito! Eu realmente não sabia dessa e iria morrer sem saber hehe.
Obrigado Galera !!
orogerio
Na verdade vc tem que avaliar a pilha construída.
O comando “sout” para imprimir chama o método (vai por cima da pilha), quando acaba esse método é que ele imprime.