Variable super en Java

Uso de la variable especial super que hace referencia a la superclase de la clase actual

La variable especial super refiere a la superclase de la clase actual. Cada objeto en Java contiene no sólo las variables de instancia de su clase sino también las de todas las clases superiores a ella. Estas variables de las superclases han de ser inicializadas antes que las variables de instancia de la propia clase. Esto se consigue llamando en el inicio del código al constructor de todas las superclases para inicializar sus campos.

Cuando se declara una clase heredando explícitamente de otra como en el código siguiente:

public class Subclase extends Superclase {

los métodos constructores no sólo han de inicializar las propiedades de la subclase sino también las de la superclase, para ello, los constructores de la subclase pueden llamar a contructores de la superclase, gracias a super:

public class Subclase extends Superclase {
super( )// puede llevar parametros
// resto de código

El uso de super es opcional pero, en caso de utilizarse, ha de ser obligatoriamente la primera sentencia del constructor. Si no se utiliza, el compilador inserta la sentencia super() al comienzo de cada método constructor de la subclase.

Super permite acceder, desde la subclase, a los métodos y las variables de la superclase. Por ejemplo, el código siguiente declara una clase que hereda de JFrame (superclase) y, en el método constructor, usa super con un parámetro String. Puesto que super es JFrame, en realidad se está declarando un objeto JFrame usando uno de sus constructores, el que lleva como argumento un String que hace de título de la ventana.

public class Marco extends JFrame {
public Marco() {
super( "Ventana JFrame" );
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// resto de código

La línea super(“Ventana JFrame”) equivale a this.setTitle(“Ventana JFrame”).Teniendo en cuenta que this es otra variable especial que se usa en métodos de instancia para hacer referencia al objeto en el que está contenido el método, this.setTitle(“Ventana JFrame”) equivale a Marco.setTitle(“Ventana JFrame”).

Super también permite sobreescribir un método de la superclase añadiéndole nuevas funcionalidades. Por ejemplo, este código permite ampliar la funcionalidad del método hacerAlgo() de la superclase, sobreescribiéndolo con el método hacerAlgo() de la subclase.

public class Subclase extends Superclase {
public void hacerAlgo() { //redefine el metodo
super.hacerAlgo(); // llama al metodo de la superclase
hacerOtraCosa(); // llama a otro metodo de la subclase
// resto de codigo