métodos e atributos sobreescritos

Estou estudando para a certificação e achei essa questão no ExamLab. Eu respondi q a saída será “1Sub 2”. Mas a saída aparece “Sub1 2”.
Não entendi pq acontece isso se o método main manda imprimir primeiro o atributo ge.i e depois chama o método. Pq??? Pq???

public class Greek {
	
	int i = 1;
	
	public int getI() {
		System.out.print("Super");
		return i;
	}
	
	public static void main(String arhs[]) {
		
		Greek ge = new Arabik();
		System.out.println(ge.i+" "+ge.getI());
	}
}

class Arabik extends Greek {
	
	int i = 2;
	
	public int getI() {
		System.out.print("Sub");
		return i;
	}
}

Note que métodos são overridden (sobreescritos), mas atributos são hidden (escondidos).

O atributo “i” declarado na classe Greek esconde o atributo “i” declarado na classe Arabik.

Ao imprimir o valor de “i”, leva-se em conta o tipo da variável, não o classe do objeto.

Ainda continuo não entendendo a ordem de impressão

Sub1 2

grato…

        System.out.println(ge.i+" "+ge.getI());  

a) O Java chama ge.i, que retorna o valor 1
b) O Java concatena esse valor “1” ao espaço, ou seja, vai dar "1 ". Note que ainda nada foi impresso, só estamos montando uma string
c) A seguir, o Java chama ge.getI(). Essa rotina faz 2 coisas:

  1. Ela imprime “Sub”
  2. Agora é que ela retorna o valor 2
    d) Acabamos de montar a string, que é “1 2”. Depois que a string está montada é que System.out.println pode imprimir a string inteira, ou seja, “1 2”.

Portanto, o que será impresso é “Sub1 2”.

putz, essa pegadinha é massa! Vlw Thingol, é nóis rumo a certificação

Não cobram coisas tão esquisitas em provas.

CCCCCCCCAAAAAARRRRRRRRRRRAAAAAAAAAACAAAAAAAAAAAAAA… jsfajashjsdfhjksdhfjkasdhfkjasdhfkasdbkjdvowhervbwekbveiurgbiurbrqiuevbibu

Esssa questão foi muito shhhhhhhhooooooooooooooooowwwwwwwwwww :smiley:

Obrigado mesmoooooo

Vixe…que questão doida hein…

Eu hein, errei logo de cara…