Referência this

###### << Anterior - Home - Próxima >>

As palavras reservadas **super** e **this** são referências que podem ser usadas dentro da classe para acessar métodos, atributos e construtores da classe ancestral (**super**) ou da própria classe (**this**). As duas referências só podem ser usadas dentro dos métodos e construtores das classes.

**this** é uma referência à própria classe. Pode ser usada para chamar um construtor dentro de outro construtor (quando a classe tem mais de um) ou para fazer referência a métodos e atributos da própria classe quando existe algum tipo de conflito de nomes. Também serve como uma variável de referência interna à instância em processo (o objeto).

### **Para acesso de métodos e atributos**

Para fazer referência a métodos ou atributos da própria classe a sintaxe é:

**this.metodo( <lista de parâmetros> )**
**ou**
**this.atributo**

Esta forma de fazer referência a atributos e métodos só é necessária quando existe algum conflito de nomes. Uma situação muito comum ocorre em métodos que são feitos para atribuir valores a atributos a partir dos parâmetros recebidos como é o caso dos construtores e setters. Nestes métodos é comum que o nome dos parâmetros seja igual ao nome dos atributos que eles irão inicializar. Isso provoca um conflito de nomes entre o nome dos parâmetros e o nome dos atributos. Pela regra de prioridade do Java, os parâmetros tem preferência sobre os atributos porque são "mais locais". O exemplo abaixo ajuda a entender melhor:

```
public class Ponto
  protected double x, y;

  // Construtor parametrizado - note o nome dos parâmetros
  //
  public Ponto(double x, double y) {
     this.x= x;
     this.y= y;
  }

  // Setters
  public void setX(double x){
     this.x = x;
  }

  public void setY(double y){
     this.y = y;
  }

} // classe Ponto

```

Vamos considerar o método **setX** do exemplo acima, mas o mesmo princípio vale para o construtor e o método **setY**. O parâmetro **x** do método **setX** tem o mesmo nome que o atributo **x** da classe, portanto há um conflito de nomes. Dentro do método, a prioridade é do parâmetro, porque é a declaração mais local, então a única forma de acessar o atributo **x** dentro do método é usando a referência **this**.

### **Para acesso a outros construtores da mesma classe**

No caso de uma classe ter mais de um construtor é bastante comum que um construtor aproveite o código de outro construtor na mesma classe. A referência **this** pode ser usada para chamar um construtor da classe dentro de outro construtor. Para isso a sintaxe é:

**this( <lista de argumentos> );**

A lista de argumentos na chamada deve combinar com a lista de parâmetros do construtor que será chamado. No exemplo abaixo foi acrescentado um copy constructor para a classe que aproveita o código do outro construtor:

```
public class Ponto
  protected double x, y;

  // Construtor parametrizado
  //
  public Ponto(double x, double y) {
     this.x= x;
     this.y= y;
  }

  // Copy constructor
  //
  public Ponto(Ponto pt){
    this(pt.x, pt.y); // chama o construtor acima
  }

  // Setters
  //
  public void setX(double x){
     this.x = x;
  }

  public void setY(double y){
     this.y = y;
  }

} // classe Ponto

```