No JavaRush, os alunos são apresentados à palavra-chave literalmente desde as primeiras palestras
e acontece que você simplesmente atribui um valor a uma variável
Ou seja,
E abaixo está o código do programa com a palavra-chave
this
. E com o tempo fica claro o que isso significa. Mas muitos, olhando para trás, provavelmente dirão honestamente a si mesmos que por muito tempo não conseguiram perceber o zen dessa palavra-chave. Neste artigo levantamos o véu dos segredos sobre o uso de palavras-chave this
para quem ainda não conseguiu descobrir... Bem-vindo! Se você pegar o livro de referência Java de Schildt , na página 171 você lerá que uma palavra-chave this
é necessária para que um método possa referenciar o objeto que o chamou. Na verdade, isso pode ser o fim de tudo. Mas precisamos de detalhes. Via de regra, this
deve ser utilizado em dois casos:
- Quando uma variável de instância de classe e uma variável de método/construtor têm o mesmo nome;
- Quando você precisa chamar um construtor de um tipo (por exemplo, um construtor padrão ou parametrizado) de outro. Isso também é chamado de chamada explícita do construtor.
Exemplo um - variável de instância e variável de método têm o mesmo nome
Digamos que temos uma classeHuman
para a qual o campo "nome" está definido: Vamos name
criar um setter para a variável (o setter funciona bastante e não há nenhum truque aqui): Observe que estamos passando a variável para o método (setter ) . Introduzimos uma nova variável e (em geral) poderíamos chamá-la do que quiséssemos porque ela só seria visível entre as {chaves} do método . Observe que há uma linha no setter: setName
String newName
setName
name = newName;
Ou seja, de fato, introduzimos uma nova variável newName
e a atribuímos a uma variável já existente na classe name
. Muitos programadores acharam estranho introduzir uma variável com um novo nome se no final estamos falando da mesma coisa. Sobre o nome na classe Human
. Portanto, os desenvolvedores da linguagem pensaram em tornar conveniente o uso de um nome de variável. Em outras palavras, por que ter dois nomes para uma variável que significa a mesma coisa? Ou seja, eu gostaria de fazer algo assim: Mas neste caso surge um problema . Agora temos duas variáveis com o mesmo nome. Um String name
pertence à classe Human
e o outro String name
ao seu método setName
. Portanto, a máquina Java não sabe a qual variável você se refere quando escreve uma string em um setter:
name = name;
Java pega o mais próximo - name
do método setName
:
name
desse método, para ela. O que, claro, não faz sentido. Portanto, era necessária alguma forma de distinguir uma variável name
de uma classe Human
, de uma variável name
de um método setName
. Para resolver este problema, foi introduzida a palavra-chave this
, que neste caso indicará que é necessário chamar uma variável não de um método, mas de uma aula Human
:
this
irá se referir ao objeto chamador, como foi dito no início do artigo. Como resultado, o nome da pessoa setName
será definido através do setter para o objeto criado. Abaixo está o código sem usar a palavra-chave this
. O código cria um objeto de classe Human
e dá um nome a ele:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
Assim, this
evita-se a introdução de novas variáveis para denotar a mesma coisa, o que torna o código menos “sobrecarregado” com variáveis adicionais.
Exemplo dois – Usando isso para chamar explicitamente um construtor
Chamar um construtor de outro pode ser útil quando você (curiosamente) tem vários construtores e não deseja reescrever o código de inicialização fornecido anteriormente no construtor em um novo construtor. Confuso? Nem tudo é tão assustador quanto parece. Veja o código abaixo, ele possui dois construtores de classeHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
Aqui primeiro temos um construtor de dois parâmetros que aceita int age
e int weight
. Digamos que escrevemos duas linhas de código nele:
this.age = age;
this.weight = weight;
e então decidiram adicionar outro construtor, com três parâmetros, que, além da idade e do peso, também leva a altura. No novo construtor você poderia escrever isto:
this.age = age;
this.weight = weight;
this.height = height;
Mas em vez de repetir o código que você já escreveu neste construtor, você pode usar uma palavra-chave para this
chamar explicitamente o construtor com dois parâmetros:
this(age, weight);
// and add the missing variable:
this.height = height;
Então você está dizendo ao construtor com três parâmetros:
- chame esse construtor, que possui dois parâmetros.
- e adicione a variável ausente.
this
é passada para todos os métodos, exceto os estáticos (por isso é this
frequentemente chamada de parâmetro implícito) e pode ser usada para se referir ao objeto que chamou o método. Não há necessidade de ter medo dessa palavra-chave, porque This
ela não assusta.
GO TO FULL VERSION