Porque dÁ essa saÍda?

6 respostas
Gustavo_Santos

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 ?!!?

6 Respostas

deniswsrosa

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.

V

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

Gustavo_Santos

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.

ViniGodoy

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 !!!

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.

Gustavo_Santos

Que isso, falei com jeitinho e tudo…

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

blackstile
Questao11 ga = new Arabik();
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).
System.out.print(ga.i + " " + ga.getI());
ga.i
Será baseado no tipo da variavel, neste caso será [color=darkred]Questão 11[/color]
ga.getI()
Será baseado no tipo do objeto intanciado, neste caso [color=brown]new Arabik[/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.

Criado 18 de setembro de 2010
Ultima resposta 1 de nov. de 2010
Respostas 6
Participantes 5