Porque dÁ essa saÍda?

Boa Tarde !!!

Não sei porque esse código imprime essa saída: Sub1 2

public class Questao11 {

	int i = 1;

	public int getI() {
		System.out.print("Super");
		return i;
	}

	public static void main(String arhs[]) {
		Questao11 ga = new Arabik();
		System.out.print(ga.i + " " + ga.getI());
	}
}

class Arabik extends Questao11 {

	int i = 2;

	public int getI() {
		System.out.print("Sub");
		return i;
	}

}

Alguém sabe explicar ?!!?

Simples.

Quando vc chama “ga.i” você está chamando a variável i da classe Questao11 que é igual a 1. Já quando vc chama ga.getI() vc está chamando o método de getI() de Arabik, já que este método foi sobrescrito.

O que lhe está ensinando é que métodos podem ser sobrescritos e variaves não.

Acho que você quis dizer que a saida é 1 Sub2, não?

Galera não me leva a mal não, mas to cansado de
saber que só método podem ser sobrescritos.

COPIEM o código e COLEM ai no eclipse de vocês, derrepente um ou outro aprende também
com esse tipo que questão !!!

A saída desse código é Sub1 2.

Na minha consepção deveria ser 1 Sub 2.

A dúvida é essa !

Grato.

[quote=Gustavo Santos]COPIEM o código e COLEM ai no eclipse de vocês, derrepente um ou outro aprende também
com esse tipo que questão !!![/quote]

E por que a grosseria? Ninguém aqui tem a obrigação de copiar e colar códigos na hora de responder.

O que ocorre é que para avaliar a concatenação de strings, todas as funções devem ser avaliadas. Quando o getI() é avaliado, ele já imprime o Sub no console, para só depois retornar o valor. Esse valor é então concatenado na saída e um novo print é dado. Note que quem imprime a palavra sub() é o print que está dentro do getI() e não o println() do main.

Da próxima vez que se irritar assim, pense primeiro em usar um depurador, o seu eclipse tem um. Rode passo-a-passo o código, sem incomodar ninguém.

Se ainda assim você não entender, então, seja mais claro na sua dúvida, indicando exatamente a situação que você achou estranha. Assim fica bem claro para nós qual é a dúvida, afinal, ninguém aqui tem a obrigação de estudar minunciosamente o código linha-a-linha, em busca de situações estranhas causadas por códigos grotescos como esses da certificação.

Sem falar que 90% dos códigos desse tipo, a dúvida está em achar que variáveis são sobrescritas, além de métodos.

Que isso, falei com jeitinho e tudo…

De qualquer forma, vlw pela força !!!

Ae galera, não sei se estou totalmente certo, mas se eu não me engano nesse caso 
as variáveis e baseada na referencia. E os métodos são baseados no objeto instanciado.
Ou seja, neste caso as variáveis são resolvidas em tempo de compilação (Tipo Referencia), enquanto os metodos serão resolvidos em tempo de excecução (Objeto Instanciado).

[code]System.out.print(ga.i + " " + ga.getI());  [/code]

[code]ga.i [/code] Será baseado no tipo da variavel, neste caso será [color=darkred][b]Questão 11[/b][/color]
[code]ga.getI()[/code]Será baseado no tipo do objeto intanciado, neste caso [color=brown][b]new Arabik[/b][/color]

Não lembro onde li isso, mas se eu não me engano foi em algum livro da Katty Sierra, ou foi no Use a Cabeça Java  ou foi no livro de Certificação;

Eu sei que está um pouco atrasado, mas pode ajudar alguém, futuramente.

Ae galera, não sei se estou totalmente certo, mas se eu não me engano nesse caso
as variáveis e baseada na referencia. E os métodos são baseados no objeto instanciado.
Ou seja, neste caso as variáveis são resolvidas em tempo de compilação (Tipo Referencia), enquanto os metodos serão resolvidos em tempo de excecução (Objeto Instanciado).

Não lembro onde li isso, mas se eu não me engano foi em algum livro da Katty Sierra, ou foi no Use a Cabeça Java ou foi no livro de Certificação;

Eu sei que está um pouco atrasado, mas pode ajudar alguém, futuramente.