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!
É isso, excelente explicação. Obrigado pela correcção do meu erro
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)