5 This¶
Introducción¶
Cuando se llama a un método, se pasa automáticamente un argumento implícito que es una referencia al objeto invocado, es decir, el objeto sobre el que se llama el método. Esta referencia se llama this, es decir, this es una variable que hace referencia al objeto actual.
Veamos los distintos usos que puede tener:
Para acceder a un atributo del objeto actual¶
Centrémonos en el getter del atributo color de la clase Vehicle:
color es un atributo de la clase Vehicle. El método getColor() de la clase Vehicle puede acceder perfectamente al atributo color ya que cuando el método getColor() es llamado, recibe de forma implícita el objeto actual, es decir, el objeto sobre el que se llama el método. Esto le permite al método getColor() poder acceder a todos los atributos de la clase y llamar a cualquier método de la misma.
Como color es un atributo de la clase Vehicle, también podíamos haber accedido a él como this.colour. Pero en realidad, cuando desde un método se accede a un atributo, se usa this de forma implícita, es decir, que aunque no escribamos this, el compilador lo sobreentiende. Por eso en la práctica, solo se indica si es imprescindible. Veamos un ejemplo en el que sea imprescindible:
En este caso, nos encontramos con dos variables que se llaman color: el atributo y el parámetro del método. El shadow (sombra) de variables se refiere a la práctica en programación de utilizar dos variables con el mismo nombre dentro de ámbitos que se superponen. La variable con el alcance de nivel superior se oculta porque la variable con el alcance de nivel inferior la anula. La variable de nivel superior se dice entonces que es "sombreada". En nuestro ejemplo, el atributo es "sombreado" por el parámetro, es decir, cuando en el método accedemos a colour, es el parámetro al que nos estamos refiriendo. Para poder acceder al atributo, necesitamos utilizar la palabra this: this.colour
. ¿Qué es lo que estamos haciendo entonces con esta línea de código: this.colour = colour
? Pues le estamos asignando el valor del parámetro al atributo, es decir, estamos actualizando el color del objeto actual con el color pasado por parámetro al método setColor.
Para invocar un constructor¶
Un constructor puede llamar a otro constructor de la clase utilizando this, pero esta llamada solamente puede estar en la primera linea de código.
public class Vehicle{
//...
public Vehicle(){
this(4, "Blanco");
}
public Vehicle(int wheelCount, String color) {
this.wheelCount = wheelCount;
this.color = color;
speed = 0;
}
//...
}
Como referencia al objeto actual¶
Dentro de la clase, siempre que queramos obtener una referencia al objeto actual, podemos utilizar this.
Supongamos que queremos modificar el método acelerar los vehículos para que devuelvan el objeto actual con la velocidad modificada por la aceleración:
Veamos más ejemplos del uso de this como referencia al objeto actual. Vamos a añadir los método nuevos a la clase Vehicle:
- addSpeeds: devuelve la suma de dos velocidades, la del objeto actual y la del vehículo pasado como parámetro.
- doubleSpeed: dobla la velocidad del objeto actual utilizando el método addSpeeds.
public double addSpeeds(Vehicle vehicle){
return speed + vehicle.speed;
}
public void doubleSpeed(){
speed = addSpeeds(this);
}
Para doblar la velocidad utilizando el método addSpeeds, tenemos que pasarle a este método la referencia al objeto actual para que sume la velocidad consigo mismo, doblando de esta forma su propia velocidad.
public class Main{
public void showThisCurrentObject(){
Vehicle car1, car2;
car1 = new Vehicle(4, "azul");
car2 = new Vehicle(2, "rojo");
car1.accelerate(90.3);
car2.accelerate(120.5);
System.out.printf("Velocidad del coche1: %.2f\n", car1.getSpeed());
System.out.printf("Velocidad del coche2: %.2f\n", car2.getSpeed());
System.out.printf("Suma de las velocidades de los dos coches: %.2f\n", car1.addSpeeds(car2));
car1.doubleSpeed();
System.out.printf("El coche1 ha doblado su velocidad: %.2f\n", car1.getSpeed());
}
public static main(String[] args){
new Main().showThisCurrentObject();
}
}
El método doubleSpeed de la clase Vehicle puede llamar perfectamente al método addSpeeds ya que cuando el método doubleSpeed es llamado, recibe de forma implícita el objeto actual, es decir, el objeto sobre el que se llama el método. Esto le permite al método doubleSpeed poder acceder a todos los atributos de la clase y llamar a cualquier método de la misma.
Como addSpeeds es un método de la clase Vehicle, el método doubleSpeed podía haberlo llamado también utilizando el this: this.addSpeeds(this)
, pero en realidad, cuando desde un método se llama a otro de la clase, se usa this de forma implícita, es decir, que aunque no escribamos this, el compilador lo sobreentiende. Por eso en la práctica, solo se indica si es imprescindible.
Ejercicio 6
Crea un paquete llamado exercise06 y copia la clase Persona del paquete exercise04 y crea un constructor que reciba todos los parámetros excepto la ocupación, siendo su valor por defecto "sin ocupación". Realice dicho constructor y los ya creados haciendo uso de la referencia this. Crea una clase Main para probar todos los constructores.
Ejercicio 7
Crea un paquete llamado exercise07 y copia la clase Persona del ejercicio anterior y crea un atributo decimal para almacenar el sueldo. Crea un método sumarSueldo que reciba una persona por parámetro. Dicho método tiene que incrementar el sueldo con el sueldo de la persona recibida como parámetro. Crear otro método, doblarSueldo, que doble el sueldo utilizando el método sumarSueldo y this. Crea un main para probarlos.