Saltar al contenido principal

Super

La palabra reservada this se utiliza para hacer referencia a la propia clase. De forma análoga, tenemos super, la cual hace referencia a la superclase de la clase donde se utiliza. Esta palabra clave resulta muy útil cuando se desea acceder a miembros (atributos y métodos) de la clase padre que puedan estar ocultos o redefinidos en la subclase.

super permite llamar a un método de la superclase desde una subclase, aunque la subclase tenga un método con el mismo nombre. Esto es útil cuando se redefine un método en la subclase, pero aún se necesita el comportamiento original de la superclase.

Acceder a atributos de la superclase con super

Por ejemplo, tenemos las siguientes clases:

public class SuperClase {
private int a;
private int b;
}

public class SubClase extends SuperClase {
private String b;
}

Como puede apreciarse, en SubClase se redefinió el atributo b. Cada vez que se utiliza dicho atributo en la SubClase estaremos utilizando un String, pero si deseamos utilizar el atributo b de tipo entero desde la subclase tenemos que escribir super.b.

public class SuperClase {
private int a;
private int b;
}

public class SubClase extends SuperClase {
private String b;

public void mostrarDatos() {
System.out.println(b);
System.out.println(super.b);
}
}

Acceder a métodos de la superclase con super

En el apartado anterior teníamos el siguiente método redefinido para Empleado que hereda de la clase Persona:

public class Persona {
// Utiliza protected para que la clase hija pueda acceder a los atributos de la clase padre
// Aquí lo utilizo a modo de ejemplo, en un caso real deberían ser privados
protected String nombre;
protected byte edad;
protected double altura;

public void mostrarDatos() {
System.out.println(nombre);
System.out.println(edad);
System.out.println(altura);
}
}
public class Empleado extends Persona {
private double salario;

@Override
public void mostrarDatos() {
System.out.println(nombre);
System.out.println(edad);
System.out.println(altura);
System.out.println(salario);
}
}

No tenemos por qué copiar el código que muestra los atributos de la superclase, podemos invocar el método mostrarDatos de la superclase, utilizando super.mostrarDatos().

La clase por lo tanto quedaría:

public class Empleado extends Persona{
private double salario; //Atributo propio

@Override
public void mostrarDatos() {
super.mostrarDatos(); // Método de la superclase
System.out.println(salario); // muestra el atributo propio
}

}

Constructor de la superclase

Algo parecido ocurre en los constructores de la superclase. Para ello disponemos del método super(), que invoca el constructor de la superclase. En caso de estar sobrecargados, podemos variar sus parámetros de entrada en número y tipo. Una restricción a tener en cuenta con super() es que tiene que ser obligatoriamente la primera instrucción del constructor.

public class Persona {
private String nombre;
private byte edad;
private double altura;

public Persona(String nombre, byte edad, double altura){
this.nombre = nombre;
this.edad = edad;
this.altura = altura;
}
}
public class Empleado extends Persona {
private double salario;

public Empleado(String nombre, byte edad, double altura, double salario){
super(nombre, edad, altura); // constructor de Persona. Primera instrucción del constructor
this.salario = salario;
}
}
Llamada automática de super()

Si no se invoca super() de forma explícita, Java llama automáticamente al constructor sin argumentos de la superclase.