Dúvida Questão ExamLab [Repondido]

8 respostas
ataufo

Pessoal, estou com uma dúvida que parece idiota mas não estou entendendo o motivo da saída, segue o programa:

public class Teste{

    int i=1;
    
    Teste(){}

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

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

class Arabik extends Teste{

    int i=2;
    
    Arabik(){}

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

}

Resultado: Sub1 2

Dúvida:

Porque o valor de ga.i no metodo main é igual a 1 ?!?!

Debugando vi que a instancia ga possue 2 atributos i, um com valor 1 e outro com 2. ??? E como ele escolhe um dos 2 ???

8 Respostas

deyvid

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

public class Teste{   

	int i=1;
	Teste(){}

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

	public static void main(String arhs[]){
		Teste ga=new Arabik();
		System.out.print(ga.i+" "+ga.getI());
		//ga.i ...atributo i da referencia a super classe Teste
		//ga.getI() ....método sobrescrito!!

	}
}

class Arabik extends Teste{

	int i=2;

	Arabik(){
	}

	public int getI(){   //////SOBRESCREVO O MÉTODO
		System.out.print("Sub");
		return i;
	}   

}
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

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”.

emmanuelrock

E como funciona essa “parada” de avaliar?

B

Ocorre em tempo de execução.

http://java.sun.com/developer/JDCTechTips/2002/tt1105.html#2

ataufo

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.

até mais
rogério

Criado 29 de julho de 2009
Ultima resposta 31 de jul. de 2009
Respostas 8
Participantes 6