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 super
para acceder a la k
variable en la superclase. Sin embargo, en cualquier otro caso, ¿qué hace super();
? ¿Por sí mismo?
java
inheritance
super
muttley91
fuente
fuente
super
no es necesario hacer referenciak
.k
se puede hacer referencia directamente.super
solo se necesitará accederA.k
si declara otro campo nombradok
enTest
(Test.k
).Respuestas:
Llamar exactamente siempre
super()
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"); } }
fuente
super
se usa para llamar a la clase padreconstructor
,methods
yproperties
.fuente
También puede utilizar la
super
palabra 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 elprint()
método de la superclaseCellPhone
. La salida será:I'm a cellphone I'm a touch screen cellphone
fuente
Cuando desee que se llame al constructor de superclase, para inicializar los campos dentro de él. Eche un vistazo a este artículo para comprender cuándo usarlo:
http://download.oracle.com/javase/tutorial/java/IandI/super.html
fuente
super()
, ya que Java lo agregará implícitamente. Pero tiene que llamarsuper(args)
si necesita un constructor padre no predeterminado.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
TheSub
llamaría a amboseatCake()
yeatMoreCake()
fuente
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.
fuente
Super llamará a tu método principal. Ver: http://leepoint.net/notes-java/oop/constructors/constructor-super.html
fuente
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 usandosuper()
usuper(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".fuente
La primera línea del constructor de su subclase debe ser una llamada
super()
para garantizar que se llame al constructor de la superclase.fuente
super(some args)
, nosuper()
. 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.super(...)
. No hay absolutamente ningún peligro de eso; solo peligro de que no se compile.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(); } }
fuente
Desde la página de documentación de Oracle :
También puede utilizar
super
para referirse a un campo oculto (aunque se desaconseja ocultar campos).Uso de
super
en constructor de subclases: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. Consuper(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
fuente