2010-11-03 20 views
68

Actualmente estoy aprendiendo acerca de la herencia de clase en mi curso de Java y no entiendo cuándo usar la llamada super()?¿Cuándo uso super()?

Editar:
me encontré con este ejemplo de código en la que se utiliza super.variable:

class A 
{ 
    int k = 10; 
} 

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

por lo que entiendo que aquí, debe utilizar super acceder a la variable k en el super-clase. Sin embargo, en cualquier otro caso, ¿qué hace super();? ¿Por sí mismo?

+29

En realidad, en este ejemplo, 'super' no es necesario para hacer referencia a' k'. 'k' se puede referenciar directamente. 'super' solo se necesitaría para acceder a' A.k' si declaraste otro campo llamado 'k' en' Test' ('Test.k'). –

Respuesta

126

Calling exactamentesuper() es siempre redundante. Está haciendo explícitamente lo que se haría implícitamente de lo contrario. Esto se debe a que si omite una llamada al superconstructor, el súper constructor sin argumento se invocará automáticamente de todos modos. No quiere decir que es un mal estilo; algunas personas les gusta ser explícito.

Sin embargo, cuando se convierte en útil es cuando el super constructor toma los argumentos que desea pasar desde 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

Suponga que se invalida un método en una clase secundaria y luego se anula de nuevo en su clase secundaria. (Herencia multinivel) ¿Qué pasa si tenemos que llamar a un método de los abuelos y los padres simultáneamente a la clase de nietos? ¿Cómo se usaría el súper? – h8pathak

+0

@ h8pathak: si preguntas cómo una clase secundaria puede eludir la implementación de sus padres pero llama al abuelo, eso no es posible en Java. –

1

Podrías usarlo para llamar al método de una superclase (como cuando anulas ese método, super.foo() etc) - esto te permitiría mantener esa funcionalidad y agregarla con cualquier otra cosa tener en el método de overriden.

0

La primera línea del constructor de la subclase debe ser una llamada a super() para asegurar que el constructor de la superclase se llama.

+0

No es cierto. Va a suceder automáticamente. –

+0

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

+0

Si no hay un constructor predeterminado, debe llamar a 'super (some args)', not 'super()'. Pero el punto es que "debe" es incorrecto. Uno de los constructores de la superclase está ** garantizado ** para ser invocado, siempre que la clase se compile. –

9

Cuando desee que se llame al constructor de la clase superior: para inicializar los campos dentro de él. Echar un vistazo a este artículo para obtener una comprensión de cuándo usarlo:

http://download.oracle.com/javase/tutorial/java/IandI/super.html

+4

Como dice en el enlace, nunca * tiene * que llamar a 'super()', ya que Java lo agregará implícitamente. Pero tienes que llamar a 'super (args)' si necesitas un constructor padre no predeterminado. –

8

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

Por ejemplo:

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

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

Construir una instancia de TheSub llamaría tanto eatCake() y eatMoreCake()

1

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

39

super se usa para llamar al constructor, methods y properties de la clase primaria.

18

También puede utilizar la palabra clave en el super subclase cuando se desea invocar un método de la clase padre cuando se ha 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 método de la superclase CellPhoneprint(). La salida será:

I'm a cellphone 
I'm a touch screen cellphone 
+0

¿Fue (String [] args) en su línea de declaración de método principal? ¡Muchas gracias! –

0

De la documentación de Oracle page:

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

También puede usar super para referirse a un campo oculto (aunque se desaconsejan los campos ocultos).

El uso de super en el constructor de las subclases:

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

La sintaxis para llamar a un constructor de la superclase es

super(); 

o:

super(parameter list); 

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

Nota: Si un constructor no invoca explícitamente 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.

Post relacionados:

Polymorphism vs Overriding vs Overloading

0

yo sólo lo han probado, comentando super(); hace lo mismo sin comentarlo como @Mark Peters dijo

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(); 
    } 
}