En JavaRush, los estudiantes conocen la palabra clave literalmente desde las primeras conferencias
y resulta que simplemente le asignas un valor a una variable
Es decir,
Y a continuación se muestra el código del programa con la palabra clave
this
. Y con el tiempo queda claro lo que significa. Pero muchos, mirando hacia atrás, probablemente se dirán honestamente que durante mucho tiempo no pudieron darse cuenta del zen de esta palabra clave. En este artículo levantamos el velo de los secretos sobre el uso de palabras clave this
para aquellos que aún no pueden descifrarlo... ¡Bienvenido! Si elige el libro de referencia de Java de Schildt , en la página 171 leerá que this
se requiere una palabra clave para que un método pueda hacer referencia al objeto que lo llamó. En realidad, este podría ser el final. Pero necesitamos detalles. Como regla general, this
se debe utilizar en dos casos:
- Cuando una variable de instancia de clase y una variable de método/constructor tienen el mismo nombre;
- Cuando necesita llamar a un constructor de un tipo (por ejemplo, un constructor predeterminado o parametrizado) de otro. Esto también se denomina llamada explícita al constructor.
Ejemplo uno: la variable de instancia y la variable de método tienen el mismo nombre
Digamos que tenemos una claseHuman
para la cual el campo "nombre" está definido: creemos name
un definidor para la variable (el definidor funciona bastante y no hay ningún truco aquí): tenga en cuenta que estamos pasando la variable al método (setter ) . Introdujimos una nueva variable y (en general) podríamos llamarla como quisiéramos porque solo sería visible dentro de las {llaves} del método . Observe que hay una línea en el configurador: setName
String newName
setName
name = newName;
Es decir, de hecho, introdujimos una nueva variable newName
y la asignamos a una variable que ya existía en la clase name
. A muchos programadores les pareció extraño introducir una variable con un nuevo nombre si al final hablamos de lo mismo. Sobre el nombre en la clase Human
. Por lo tanto, los desarrolladores del lenguaje pensaron en hacer más conveniente el uso de un nombre de variable. En otras palabras, ¿por qué tener dos nombres para una variable que significa lo mismo? Es decir, me gustaría hacer algo como esto: Pero en este caso surge un problema . Ahora tenemos dos variables que tienen el mismo nombre. Uno String name
pertenece a la clase Human
y el otro String name
a su método setName
. Por lo tanto, la máquina Java no sabe a qué variable te refieres cuando escribes una cadena en un definidor:
name = name;
Java toma el más cercano, name
del método setName
:
name
de este método. Lo cual por supuesto no tiene ningún sentido. Por lo tanto, se necesitaba alguna forma de distinguir una variable name
de una clase Human
de una variable name
de un método setName
. Para solucionar este problema se introdujo la palabra clave this
, que en este caso indicará que es necesario llamar a una variable no de un método, sino de una clase Human
:
this
se referirá al objeto llamante, como se dijo al principio del artículo. Como resultado, el nombre de la persona setName
se establecerá a través del configurador en el objeto creado. A continuación se muestra el código sin utilizar la palabra clave this
. El código crea un objeto de clase Human
y le da un nombre:
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);
}
}
Por lo tanto, this
evita introducir nuevas variables para denotar lo mismo, lo que hace que el código esté menos "sobrecargado" con variables adicionales.
Ejemplo dos: usar esto para llamar explícitamente a un constructor
Llamar a un constructor desde otro puede ser útil cuando (por extraño que parezca) tiene varios constructores y no desea reescribir el código de inicialización proporcionado anteriormente en el constructor en un nuevo constructor. ¿Confundido? No todo es tan aterrador como parece. Mire el código a continuación, tiene dos constructores de clasesHuman
:
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){
//llamas al constructor con dos parámetros
this(age, weight);
//y agrega la variable que falta
this.height = height;
}
}
Aquí primero tenemos un constructor de dos parámetros que acepta int age
y int weight
. Digamos que escribimos dos líneas de código en él:
this.age = age;
this.weight = weight;
y luego decidieron agregar otro constructor, con tres parámetros, que además de la edad y el peso, también toma la altura. En el nuevo constructor podrías escribir esto:
this.age = age;
this.weight = weight;
this.height = height;
Pero en lugar de repetir el código que ya has escrito en este constructor, puedes usar una palabra clave para this
llamar explícitamente al constructor con dos parámetros:
this(age, weight);
// y agrega la variable que falta:
this.height = height;
Entonces le estás diciendo al constructor con tres parámetros:
- Llame a este constructor, que tiene dos parámetros.
- y agregue la variable que falta.
this
se pasa a todos los métodos excepto a los estáticos (de ahí que this
a menudo se la llame parámetro implícito) y se puede usar para hacer referencia al objeto que llamó al método. No hay por qué tener miedo de esta palabra clave, porque This
no da miedo.
GO TO FULL VERSION