Historia de la cuestión:
En las primeras versiones de Java se implementó un mecanismo de herencia que permite a la clase hija expandir el comportamiento de la clase padre. Para acceder a los miembros de la clase padre se utiliza la palabra clave super, heredada de C++.
Problema:
A veces es necesario llamar explícitamente a un método o campo de la clase padre, si han sido sobrescritos o ocultos. Sin un uso adecuado de super, pueden ocurrir errores o comportamientos incorrectos, por ejemplo, al trabajar con constructores.
Solución:
Con super se puede:
Ejemplo:
class Animal { void makeSound() { System.out.println("Sonido de Animal"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Sonido de Animal System.out.println("Ladrido"); } }
Características clave:
¿Puede la llamada a super no ser la primera línea del constructor?
No. La llamada al constructor del padre con super() debe ser la primera línea del constructor. Si se viola esta restricción, el compilador dará un error.
¿Se puede usar super en métodos o contextos estáticos?
No. La palabra clave super solo se aplica en contexto de instancia (no estático), ya que se relaciona con la jerarquía de objetos, no de clases.
¿Se puede acceder a un método privado del padre a través de super?
No. Los métodos privados no son visibles para los descendientes, ni siquiera a través de super. Solo los métodos o campos públicos, protegidos y de paquete pueden ser accedidos a través de super.
El desarrollador olvida llamar explícitamente a super() en el constructor de la clase derivada, y la superclase no tiene un constructor por defecto.
Ventajas:
Desventajas:
El método sobrescrito en la subclase llama primero a la realización de super y luego lo amplía con lógica adicional.
Ventajas:
Desventajas: