¡Hola muchachos!
Bueno, vayamos aclarando varias cosas con ejemplos para despejar dudas, pero vamos de a poco.
Modificadores de acceso
- public: Los métodos y atributos con este modificador serán accesibles para cualquier clase dentro del proyecto.
- private: Los métodos y atributos con este modificador serán accesibles solo para la clase donde fueron definidos.
- protected: Los métodos y atributos con este modificador serán accesibles solo para la clase donde fueron definidos y sus clases hijas.
- default: Modificador por defecto. El acceso se aplica solo para elementos del mismo package.
Entonces, entiendiendo cómo operan los modificadores de acceso, veamos qué es this
- this es una palabra reservada en Java.
- this nos ayuda a referenciar explícitamente a miembros de una misma instancia.
Ahora, vamos a ver un ejemplo práctico de todo esto:
Tenemos una clase Animal, como se muestra a continuación:
public class Animal {
private String nombre;
private int edad;
public Animal(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
}
Y tenemos una clase hija, llamada Gato, a continuación:
public class Gato extends Animal{
private String raza;
public Gato(String nombre, int edad, String raza) {
super(nombre, edad);
this.raza = raza;
}
public String getRaza() {
return raza;
}
public void setRaza(String raza) {
this.raza = raza;
}
public void mostrarEdad(){
System.out.println(this.getEdad());
}
public void mostrarNombre(){
System.out.println(super.getNombre());
}
public void mostrarRaza(){
System.out.println(this.getRaza());
}
}
Bien, vamos revisando poco a poco.
La clase Animal es padre de la clase Gato.
Los atributos de la clase Animal están encapsulados. Esto quiere decir que como son privados, no tendremos acceso a ellos desde la clase Gato.
Los métodos de la clase Animal son públicos, por lo que tendremos acceso a ellos desde nuestras clases hijas, como Gato.
La clase Gato, en el constructor, está utilizando la palabra reservada super para acceder al constructor de la clase padre Animal de modo que a través de él, heredará sus atributos y métodos. Entonces los métodos públicos de la clase Animal podremos utilizarlos en la clase Gato porque fueron heredados. Los atributos privados de la clase Animal también fueron heredados a la clase Gato pero no tendremos acceso a ellos porque son privados.
En la clase Gato existen 3 métodos interesantes, mostrarEdad(), mostrarNombre y mostrarRaza.
El método mostrarEdad() hace uso de la palabra reservada this para especificar explícitamente que queremos hacer referencia a la edad del Gato.
Espera espera... No me confundas. Dijiste que la palabra reservada this hacía referencia a los miembros de una instancia, es decir, a los elementos de la clase Gato, pero ahí se está haciendo referencia a un elemento de la clase padre, Animal, que es getEdad.
Pues, esto sucede porque cuando Gato, en el constructor, utilizó la palabra reservada super, realmente se trajo a esta instancia sus elementos, así que por consiguiente ahora getEdad es un método propio de esta instancia también y puede ser accedido a través de la palabra reservada this.
Sigamos, el método mostrarNombre() está haciendo uso de la palabra reservada super para especificar explícitamente que quiere referencia no al miembro de esta instancia sino que al miembro directo de la clase padre, getNombre().
Espera espera, ok. Déjame ver si lo entiendo bien. Entonces this.getNombre y super.getNombre ¿Son elementos diferentes?
No, el elemento es exactamente el mismo en una instancia, pero su referencia es distinta. Por eso entregan el mismo resultado. Verás, ambos atributos están alojados en el mismo espacio de memora, pero son accedidos desde distintos puntos del código, uno desde la clase Animal y el otro desde la clase Gato.
- Finalmente el método mostrarRaza() solo funciona con this y no con super, porque para este caso getRaza es un método que solo existe en la clase hija Gato, no es un método heredado.
Y así es como operan las palabras reservadas:
- this
- super