¿Cuándo uso super ()?


80

Actualmente estoy aprendiendo sobre la herencia de clases en mi curso de Java y no entiendo cuándo usar la super()llamada.

Editar:
encontré este ejemplo de código donde se usa:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

Entonces entiendo que aquí, debe usar superpara acceder a la kvariable en la superclase. Sin embargo, en cualquier otro caso, ¿qué hace super();? ¿Por sí mismo?


30
En realidad, en este ejemplo superno es necesario hacer referencia k. kse puede hacer referencia directamente. supersolo se necesitará acceder A.ksi declara otro campo nombrado ken Test( Test.k).
Mark Peters

Respuestas:


143

Llamar exactamente siempresuper() es redundante. Está haciendo explícitamente lo que se haría implícitamente de otro modo. Eso es porque si omite una llamada al superconstructor, el superconstructor sin argumentos se invocará automáticamente de todos modos. No quiere decir que sea de mal estilo; a algunas personas les gusta ser explícitas.

Sin embargo, donde se vuelve útil es cuando el superconstructor toma los argumentos que desea pasar de la subclase.

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}

2
Supongamos que un método se invalida en una clase secundaria y luego se invalida nuevamente en su clase secundaria. (Herencia multinivel) ¿Qué sucede si tenemos que llamar a un método del abuelo y del padre simultáneamente en la clase de nietos? ¿Cómo se usaría el super?
h8pathak

1
@ h8pathak: Si está preguntando cómo una clase secundaria puede eludir la implementación de su padre pero llamar al abuelo, eso no es posible en Java.
Mark Peters

44

superse usa para llamar a la clase padre constructor, methodsy properties.


22

También puede utilizar la superpalabra clave en la subclase cuando desee invocar un método de la clase principal cuando lo haya anulado en la subclase.

Ejemplo:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

Aquí, la línea super.print()invoca el print()método de la superclase CellPhone. La salida será:

I'm a cellphone
I'm a touch screen cellphone

1
¿Estaba (String [] args) en la línea de declaración de su método principal? ¡Muchas gracias!
Appalachian Math


9

Lo usaría como la primera línea de un constructor de subclase para llamar al constructor de su clase padre.

Por ejemplo:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

La construcción de una instancia de TheSubllamaría a ambos eatCake()yeatMoreCake()


1

Puede usarlo para llamar al método de una superclase (como cuando está anulando un método de este tipo, super.foo (), etc.); esto le permitiría mantener esa funcionalidad y agregarla con cualquier otra cosa que tenga en el anulado método.



1

Llamas super()para ejecutar específicamente un constructor de tu superclase. Dado que una clase puede tener múltiples constructores, puede llamar a un constructor específico usando super()u super(param,param)o puede dejar que Java lo maneje y llamar al constructor estándar. Recuerde que las clases que siguen una jerarquía de clases siguen la relación "es-a".


0

La primera línea del constructor de su subclase debe ser una llamada super()para garantizar que se llame al constructor de la superclase.


No es verdad. Sucederá automáticamente.
Mark Peters

¿Incluso si no hay un constructor predeterminado? ¿Cómo sabrá qué pasar?
robev

Si no hay un constructor predeterminado, debe llamar super(some args), no super(). Pero el punto es que "debe" está mal. Se garantiza que se llamará a uno de los constructores de la superclase mientras la clase se compile.
Mark Peters

No dejé en claro que cuando escribí super () no me refería a un constructor sin parámetros, simplemente no tenía ganas de escribir ninguno. Y sí, quise decir que necesitabas llamarlo o no se compilará, por eso dije que debo.
robev

1
Una vez más, NO necesita una llamada explícita a un superconstructor si existe un constructor sin argumentos en la clase principal. Siempre se llamará a un superconstructor , mientras que tu fraseo hace que parezca que estás en peligro de que no se llame a un superconstructor si no lo pones super(...). No hay absolutamente ningún peligro de eso; solo peligro de que no se compile.
Mark Peters

0

Lo acabo de probar, comentando super (); hace lo mismo sin comentarlo como dijo @Mark Peters

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}

0

Desde la página de documentación de Oracle :

Si su método anula uno de los métodos de su superclase, puede invocar el método anulado mediante el uso de la palabra clave super.

También puede utilizar superpara referirse a un campo oculto (aunque se desaconseja ocultar campos).

Uso de superen constructor de subclases:

La invocación de un constructor de superclase debe ser la primera línea del constructor de subclase.

La sintaxis para llamar a un constructor de superclase es

super();  

o:

super(parameter list);

Con super(), se llama al constructor sin argumentos de la superclase. Con super(parameter list), se llama al constructor de superclase con una lista de parámetros coincidentes.

Nota: Si un constructor no invoca explícitamente a un constructor de superclase, el compilador de Java inserta automáticamente una llamada al constructor sin argumentos de la superclase . Si la superclase no tiene un constructor sin argumentos, obtendrá un error en tiempo de compilación.

Publicación relacionada:

Polimorfismo vs anulación vs sobrecarga

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.