"this" explicação

Pessoal… eu já li sobre o “this” mas não entendi bem… será que alguem poderia me explicar ( se puder, com exemplos ) de uma maneira bem fácil como e quando usar o “this”?

O this gera sempre muita confusão, eu também ainda tenho algumas dúvidas sobre o this. Tipo, como toda a gente sabe o this é uma referência para o objecto corrente, certo? então eu pergunto: como sei qual é o objecto corrente? Ás vezes pelo contexto vê-se logo, mas há situações em que dificilmente consigo identificar ou pelo menos explicar o seu uso.

Para clarificar melhor o uso do this:


JFrame f = new JFrame();
this.setVisible(true);

Podia ser escrito assim:

JFrame f = new JFrame(); f.setVisible(true);

Qual é a vantagem? Ou o this só faz sentido se for usado num contexto em que se desconhece a referência ao objecto?

Outro exemplo:

[code]public class Teste{
int x=10;
Teste(int x){
System.out.println(this.x+" "+x);
this.x=x;
System.out.println(this.x+" "+x);
}
public static void main (String []arg){
Teste t = new Teste(20);}

}
[/code]

x-> É a variável passada como argumento
this.x -> É a variável de instância da classe

Particularmente eu dificilmente uso this, mas ele se refere a instancia do objeto em si, ao “eu”… o que uso mais frequentemente é super…

de qualquer forma, esses dois códigos são completamente diferentes:

JFrame f = new JFrame();
this.setVisible(true);
 JFrame f = new JFrame();
f.setVisible(true); 

O primeiro chama o método setVisible da classe onde f foi criado e não o setVisible de f, pode até dar erro de compilação caso essa classe não tenha esse método… ja o segundo chama o método setVisible da instancia f que é do tipo JFrame.

O primeiro poderia ser escrito assim:

JFrame f = new JFrame();
setVisible(true);

O segundo código postado, geralmente nos construtores o pessoal passa nome da variavel igual ao nome do atributo, nesse caso o identificador (que no seu caso é x) se refere a váriavel local (passada por parâmetro) e se vc quizer acessar o atributo de instancia (tb chamado de x), deve usar this.

O this pode ficar complicado nesses casos, tentem entender o que ocorre aqui:

class Pai {
	public int x;

	void setX(int x) {
		this.x = x + 5;
	}
}

public class Teste extends Pai {

	public int x;

	void setX(int x) {
		this.x = x + 10;
		super.setX(x);
	}
	
	public static void main(String[] args) {
		Teste t = new Teste();
		t.setX(10);
		System.out.println(t.x);
	}
}

Acho que entendendo isso, vcs pegam certinho o this.

Ja adiantando, isso ai imprime 20 no final, e super.setX(x) chama o método setX da classe Pai…

flw! :wink:

É isso, excelente explicação. Obrigado pela correcção do meu erro :slight_smile:

Caramba! Este último código embolou tudo… deu um nó na minha cabeça agora hehe não consegui entender como chegar a imprimir 20. Esse monte de this e métodos iguais(void setX(int x)), embolou aqui.

sorry
se vc não aprendeu ainda herança, então desconcidera o código e fica apenas com a parte do this serve para referenciar a própria instancia (eu referenciar eu mesmo :P)