Aprender sobre herencia implica comprender cómo funciona la palabra reservada super en Java, ya que esta es determinante en el proceso de entender cómo funcionan las relaciones entre una clase padre y una clase hija. El día de hoy queremos contarte exactamente en qué consiste el super en Java y cómo se utiliza.
¿Qué es la palabra reservada super en Java?
La palabra super en Java es una palabra reservada que es usada principalmente en el contexto de la herencia, para acceder a miembros, ya sean atributos o métodos, de la clase padre, desde alguna clase hija. Si necesitamos invocar comportamientos o acceder a variables de clase superior que han sido ocultadas o sobreescritas, el super en Java es una excelente opción de hacerlo.
La palabra super en Java tiene tres usos principales, a saber:
- Acceder a los miembros de datos de la clase padre.
- Invocar los constructores de la clase padre.
- Llamar a los métodos de la clase padre que han sido sobrescritos en la clase hija.
Veamos cada uno de estos casos con más detalle.
Usar super para acceder a miembros de la clase padre
En los casos en los que una clase hija tiene un atributo o método con el mismo nombre que el de la clase padre, se puede usar super para diferenciar a cuál de ellos nos estamos refiriendo. Esto lo que nos permite es acceder al atributo o método de la clase padre, aun si ha sido sobrescrito en la clase hija. Veamos un ejemplo:
class Vehiculo {
String tipo = "vehiculo";
}
class Coche extends Vehiculo {
String tipo = "coche";
public void imprimirTipos() {
System.out.println(tipo); // Accede al tipo de Coche
System.out.println(super.tipo); // Accede al tipo de Vehiculo usando super
}
}
public class Main {
public static void main(String[] args) {
Coche miCoche = new Coche();
miCoche.imprimirTipos();
}
}
La salida quedaría así:
coche
vehiculo
En este ejemplo super.tipo hace alusión al atributo tipo de la clase Vehiculo, mientras que tipo solo accede al atributo de la clase Coche.
Usar super para invocar los constructores de la clase padre
Otra de las cosas que podemos hacer con super en Java es llamar al constructor de la clase padre. Cada vez que se crea un objeto de la clase hija, se llama de manera implícita al constructor de la clase padre. No obstante, si el constructor de la clase padre requiere parámetros, es necesario usar super en Java para pasar esos parámetros de manera explícita:
class Animal {
String nombre;
// Constructor de la clase padre
public Animal(String nombre) {
this.nombre = nombre;
}
}
class Perro extends Animal {
String raza;
// Constructor de la clase hija invocando al de la clase padre
public Perro(String nombre, String raza) {
super(nombre); // Llama al constructor de la clase Animal
this.raza = raza;
}
public void imprimirDetalles() {
System.out.println("Nombre: " + nombre);
System.out.println("Raza: " + raza);
}
}
public class Main {
public static void main(String[] args) {
Perro miPerro = new Perro("Rex", "Labrador");
miPerro.imprimirDetalles();
}
}
La salida nos mostraría:
Nombre: Rex
Raza: Labrador
Aquí, usamos super(nombre) para llamar al constructor de la clase Animal y asignar el valor a nombre
.
Usar super para invocar métodos sobreescritos
En el lenguaje Java las clases hijas pueden sobrescribir los métodos de la clase padre para así proporcionar un comportamiento diferente. No obstante, en algunos casos es posible que aun necesites llamar al método de la clase padre. Esto es posible gracias a super en Java:
class Sonido {
public void reproducirSonido() {
System.out.println("Reproduciendo sonido genérico...");
}
}
class Tambor extends Sonido {
@Override
public void reproducirSonido() {
System.out.println("Reproduciendo sonido de tambor...");
}
public void reproducirAmbosSonidos() {
super.reproducirSonido(); // Llama al método de la clase padre
reproducirSonido(); // Llama al método sobreescrito en la clase hija
}
}
public class Main {
public static void main(String[] args) {
Tambor miTambor = new Tambor();
miTambor.reproducirAmbosSonidos();
}
}
La salida quedaría así:
Reproduciendo sonido genérico...
Reproduciendo sonido de tambor...
En este caso, super.reproducirSonido() llama al método reproducirSonido() de la clase Sonido, mientras que reproducirSonido() invoca el método sobrescrito en la clase Tambor.
Keepcoding es una institución comprometida con tu formación, por eso hoy queremos invitarte a seguir aprendiendo por medio de nuestro bootcamp sobre Java, una oportunidad única que te abrirá las puertas del sector tecnológico en poco tiempo. ¡Inscríbete ahora y recibe grandes beneficios!