NOTA: en el primer caso, la clase padre debe tener un error de constructor sin argumento que arrojará un error de compilación.
KNU
Nit: La terminología padre / hijo no es muy buena para las jerarquías de clases. (Un niño no es un padre.)
aioobe
¿Hay alguna restricción sobre dónde se puede usar super?
Aaron Franke
2
@VivekChavda, seguro que un niño puede ser padre, al igual que un estudiante puede ser maestro, etc. Pero creo que entiendes la diferencia en comparación con Animal -> Perro, por ejemplo. Un perro es necesariamente un animal. Padre / hijo es típicamente una tiene una relación ( "Un padre tiene un hijo"), mientras que un animal / perro es un "es una" relación. Ver aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@AaronFranke, "¿Hay alguna restricción sobre dónde se puede usar super?" - Sí, super(...)solo se puede usar como la primera instrucción en un constructor.
aioobe
154
Algunos hechos:
super() se usa para llamar al padre inmediato.
super() se puede usar con miembros de instancia, es decir, variables de instancia y métodos de instancia.
super() se puede usar dentro de un constructor para llamar al constructor de la clase padre.
Bien, ahora implementemos prácticamente estos puntos de super().
Vea la diferencia entre el programa 1 y 2. Aquí, el programa 2 prueba nuestra primera declaración de super()en Java.
Programa 1
classBase{int a =100;}classSup1extendsBase{int a =200;voidShow(){System.out.println(a);System.out.println(a);}publicstaticvoid main(String[] args){newSup1().Show();}}
Salida:
200
200
Ahora echa un vistazo al programa 2 e intenta descubrir la diferencia principal.
Programa 2
classBase{int a =100;}classSup2extendsBase{int a =200;voidShow(){System.out.println(super.a);System.out.println(a);}publicstaticvoid main(String[] args){newSup2().Show();}}
Salida:
100
200
En el programa 1, la salida era solo de la clase derivada. No pudo imprimir la variable de la clase base ni la clase padre. Pero en el programa 2, utilizamos super()con variable aal imprimir su salida, y en lugar de imprimir el valor de variable ade la clase derivada, imprimió el valor de variable ade la clase base. Por lo tanto, demuestra que super()se usa para llamar al padre inmediato.
OK, ahora mira la diferencia entre el programa 3 y el programa 4.
Programa 3
classBase{int a =100;voidShow(){System.out.println(a);}}classSup3extendsBase{int a =200;voidShow(){System.out.println(a);}publicstaticvoidMain(String[] args){newSup3().Show();}}
Salida:
200
Aquí la salida es 200. Cuando llamamos Show(), se llamó a la Show()función de la clase derivada. Pero, ¿qué debemos hacer si queremos llamar a la Show()función de la clase padre? Echa un vistazo al programa 4 para la solución.
Programa 4
classBase{int a =100;voidShow(){System.out.println(a);}}classSup4extendsBase{int a =200;voidShow(){super.Show();System.out.println(a);}publicstaticvoidMain(String[] args){newSup4().Show();}}
Salida:
100
200
Aquí estamos obteniendo dos salidas, 100 y 200. Cuando Show()se invoca la función de la clase derivada, primero llama a la Show()función de la clase padre, porque dentro de la Show()función de la clase derivada, llamamos a la Show()función de la clase padre poniendo la superpalabra clave antes del nombre de la función.
¿Por qué no sangró sus ejemplos de código fuente? Hay una razón específica?
erikbwork
NO erikb, quiero saber el uso de super (). De ahora en adelante solo voy a
Mohan
En mi clase base sobrecargo al constructor con uno, dos, ... argumentos
Mohan
pero en mi clase derivada uso super () sin ningún argumento. a continuación, lo que ocurrirá si se trata de forma automática llama a un constructor por defecto de una clase base
Mohan
2
super()No es una palabra clave. Es una invocación de constructor. superes una palabra clave, y # 1 y # 2 solo tiene sentido con esa definición.
Si. super(...)invocará al constructor de la superclase.
Ilustración:
Ejemplo independiente:
classAnimal{publicAnimal(String arg){System.out.println("Constructing an animal: "+ arg);}}classDogextendsAnimal{publicDog(){super("From Dog constructor");System.out.println("Constructing a dog.");}}publicclassTest{publicstaticvoid main(String[] a){newDog();}}
Huellas dactilares:
Constructing an animal:FromDog constructor
Constructing a dog.
En mi clase base sobrecargo el constructor con uno, dos, ... argumentos en mi clase derivada, uso super () sin ningún argumento. a continuación, lo que ocurrirá si se trata de forma automática llama a un constructor por defecto de una clase base
Mohan
Si. Si lo llama super(), invocará al constructor de la superclase que no acepta argumentos. Del mismo modo, invocará el constructor de 1 argumento si lo hace super(arg1), y así sucesivamente.
aioobe
si no hubo un constructor sin ningún argumento en la clase base, entonces qué sucede si la clase derivada llama a super ().
Mohan
1
Nada. No se compilará. Si proporciona un constructor usted mismo, no se generará el constructor automático / predeterminado / sin argumento, por super()lo que no será una llamada válida.
aioobe
29
¿Se usa super () para llamar al constructor padre?
Si.
Por favor explique sobre Super ().
super()es un uso especial de la superpalabra clave donde se llama un constructor padre sin parámetros. En general, la superpalabra clave se puede usar para llamar a métodos anulados, acceder a campos ocultos o invocar el constructor de una superclase.
super()se usa para llamar al constructor padre, super.myMethod()se usa para llamar a un método anulado.
Sean Patrick Floyd el
2
@seanizer o cualquier otro método de la superclase (incluidas las estadísticas) si está dentro del alcance. super es solo una referencia a tu clase base.
atamanroman
3
No creo que super () se use para llamar a métodos de clase base. Sin embargo, puedes usar super.method ().
Dheeraj Joshi
@seanizer, @Dheeraj: Gracias por sus comentarios, he adaptado mi respuesta.
Heinzi
7
Llamar al súper constructor sin argumentos es solo una pérdida de espacio en la pantalla y tiempo de programación. El compilador genera exactamente el mismo código, lo escriba o no.
Simplemente super (); solo llamará al constructor predeterminado, si existe de la superclase de una clase. Pero debe escribir explícitamente el constructor predeterminado usted mismo. Si no lo hace, Java generará uno para usted sin implementaciones, guarde super (); , refiriéndose al Objeto universal de Superclase, y no puede llamarlo en una subclase.
publicclassAlien{publicAlien(){//Default constructor is written out by user/** Implementation not shown…**/}}publicclassWeirdAlienextendsAlien{publicWeirdAlien(){super();//calls the default constructor in Alien.}}
Me gustaría compartir con códigos todo lo que entendí.
La palabra clave super en java es una variable de referencia que se utiliza para referirse a objetos de clase primaria. Se utiliza principalmente en los siguientes contextos: -
1. Uso de super con variables:
classVehicle{int maxSpeed =120;}/* sub class Car extending vehicle */classCarextendsVehicle{int maxSpeed =180;void display(){/* print maxSpeed of base class (vehicle) */System.out.println("Maximum Speed: "+super.maxSpeed);}}/* Driver program to test */classTest{publicstaticvoid main(String[] args){Car small =newCar();
small.display();}}
Salida:-
MaximumSpeed:120
Uso de super con métodos:
/* Base class Person */classPerson{void message(){System.out.println("This is person class");}}/* Subclass Student */classStudentextendsPerson{void message(){System.out.println("This is student class");}// Note that display() is only in Student class void display(){// will invoke or call current class message() method
message();// will invoke or call parent class message() method super.message();}}/* Driver program to test */classTest{publicstaticvoid main(String args[]){Student s =newStudent();// calling display() of Student
s.display();}}
Salida:-
This is student classThis is person class
3. Uso de super con constructores:
classPerson{Person(){System.out.println("Person class Constructor");}}/* subclass Student extending the Person class */classStudentextendsPerson{Student(){// invoke or call parent class constructor super();System.out.println("Student class Constructor");}}/* Driver program to test*/classTest{publicstaticvoid main(String[] args){Student s =newStudent();}}
Constructores
En un constructor, puede usarlo sin un punto para llamar a otro constructor. superllama a un constructor en la superclase; thisllama a un constructor en esta clase:
publicMyClass(int a){this(a,5);// Here, I call another one of this class's constructors.}publicMyClass(int a,int b){super(a, b);// Then, I call one of the superclass's constructors.}
superes útil si la superclase necesita inicializarse. thises útil para permitirle escribir todo el código de inicialización duro solo una vez en uno de los constructores y llamarlo desde todos los otros constructores, mucho más fáciles de escribir.
Métodos
En cualquier método, puede usarlo con un punto para llamar a otro método. super.method()llama a un método en la superclase; this.method()llama a un método en esta clase:
publicString toString(){int hp =this.hitpoints();// Calls the hitpoints method in this class// for this object.String name =super.name();// Calls the name method in the superclass// for this object.return"["+ name +": "+ hp +" HP]";}
superes útil en un determinado escenario: si su clase tiene el mismo método que su superclase, Java asumirá que desea el de su clase; superle permite solicitar el método de la superclase en su lugar. thises útil solo como una forma de hacer que su código sea más legible.
La palabra clave super puede usarse para llamar al constructor de la superclase y para referirse a un miembro de la superclase
Cuando llama a super () con los argumentos correctos, en realidad llamamos al constructor Box , que inicializa las variables ancho , alto y profundidad , al que se hace referencia utilizando los valores de los parámetros correspondientes. Solo le queda inicializar su peso de valor agregado. Si es necesario, ahora puede hacer que las variables de clase Box sean privadas . Anote en los campos del modificador privado de clase Box y asegúrese de que puede acceder a ellos sin ningún problema.
En la superclase puede haber varios constructores de versiones sobrecargadas, por lo que puede llamar al método super () con diferentes parámetros. El programa realizará el constructor que coincide con los argumentos especificados.
super es una palabra clave. Se utiliza dentro de una definición de método de subclase para llamar a un método definido en la superclase. No se pueden llamar métodos privados de la superclase. Solo los métodos públicos y protegidos pueden ser llamados por la palabra clave super. También lo usan los constructores de clases para invocar a los constructores de su clase padre.
Como se indicó, dentro del constructor predeterminado hay un super () implícito llamado en la primera línea del constructor.
Este super () llama automáticamente a una cadena de constructores que comienza en la parte superior de la jerarquía de clases y se mueve hacia abajo en la jerarquía.
Si hubiera más de dos clases en la jerarquía de clases del programa, primero se llamaría al constructor predeterminado de la clase superior .
Aquí hay un ejemplo de esto:
class A {
A(){System.out.println("Constructor A");}}class B extends A{public B(){System.out.println("Constructor B");}}class C extends B{public C(){System.out.println("Constructor C");}publicstaticvoid main(String[] args){
C c1 =new C();}}
Respuestas:
super()
llama al constructor padre sin argumentos.Se puede usar también con argumentos. Es decir,
super(argument1)
y llamará al constructor que acepta 1 parámetro del tipo deargument1
(si existe).También se puede usar para llamar a métodos del padre. Es decir
super.aMethod()
Más información y tutorial aquí.
fuente
super(...)
solo se puede usar como la primera instrucción en un constructor.Algunos hechos:
super()
se usa para llamar al padre inmediato.super()
se puede usar con miembros de instancia, es decir, variables de instancia y métodos de instancia.super()
se puede usar dentro de un constructor para llamar al constructor de la clase padre.Bien, ahora implementemos prácticamente estos puntos de
super()
.Vea la diferencia entre el programa 1 y 2. Aquí, el programa 2 prueba nuestra primera declaración de
super()
en Java.Programa 1
Salida:
Ahora echa un vistazo al programa 2 e intenta descubrir la diferencia principal.
Programa 2
Salida:
En el programa 1, la salida era solo de la clase derivada. No pudo imprimir la variable de la clase base ni la clase padre. Pero en el programa 2, utilizamos
super()
con variablea
al imprimir su salida, y en lugar de imprimir el valor de variablea
de la clase derivada, imprimió el valor de variablea
de la clase base. Por lo tanto, demuestra quesuper()
se usa para llamar al padre inmediato.OK, ahora mira la diferencia entre el programa 3 y el programa 4.
Programa 3
Salida:
Aquí la salida es 200. Cuando llamamos
Show()
, se llamó a laShow()
función de la clase derivada. Pero, ¿qué debemos hacer si queremos llamar a laShow()
función de la clase padre? Echa un vistazo al programa 4 para la solución.Programa 4
Salida:
Aquí estamos obteniendo dos salidas, 100 y 200. Cuando
Show()
se invoca la función de la clase derivada, primero llama a laShow()
función de la clase padre, porque dentro de laShow()
función de la clase derivada, llamamos a laShow()
función de la clase padre poniendo lasuper
palabra clave antes del nombre de la función.fuente
super()
No es una palabra clave. Es una invocación de constructor.super
es una palabra clave, y # 1 y # 2 solo tiene sentido con esa definición.Artículo fuente: Java: Calling super ()
Si.
super(...)
invocará al constructor de la superclase.Ilustración:
Ejemplo independiente:
Huellas dactilares:
fuente
super()
, invocará al constructor de la superclase que no acepta argumentos. Del mismo modo, invocará el constructor de 1 argumento si lo hacesuper(arg1)
, y así sucesivamente.super()
lo que no será una llamada válida.Si.
super()
es un uso especial de lasuper
palabra clave donde se llama un constructor padre sin parámetros. En general, lasuper
palabra clave se puede usar para llamar a métodos anulados, acceder a campos ocultos o invocar el constructor de una superclase.Aquí está el tutorial oficial.
fuente
super()
se usa para llamar al constructor padre,super.myMethod()
se usa para llamar a un método anulado.Llamar al súper constructor sin argumentos es solo una pérdida de espacio en la pantalla y tiempo de programación. El compilador genera exactamente el mismo código, lo escriba o no.
fuente
Sí,
super()
(en minúsculas) llama a un constructor de la clase padre. Puede incluir argumentos:super(foo, bar)
También hay una
super
palabra clave, que puede usar en métodos para invocar un método de la superclaseUn rápido google para "Java super" resulta en esto
fuente
Eso es correcto. Super se usa para llamar al constructor padre. Supongamos que tiene un bloque de código así
Luego puede asignar un valor a la variable miembro n.
fuente
He visto todas las respuestas. Pero todos olvidaron mencionar un punto muy importante:
super () debería llamarse o usarse en la primera línea del constructor.
fuente
Simplemente super (); solo llamará al constructor predeterminado, si existe de la superclase de una clase. Pero debe escribir explícitamente el constructor predeterminado usted mismo. Si no lo hace, Java generará uno para usted sin implementaciones, guarde super (); , refiriéndose al Objeto universal de Superclase, y no puede llamarlo en una subclase.
fuente
Por ejemplo, en la automatización de selenio, tiene un PageObject que puede usar el constructor de su padre de la siguiente manera:
fuente
Me gustaría compartir con códigos todo lo que entendí.
La palabra clave super en java es una variable de referencia que se utiliza para referirse a objetos de clase primaria. Se utiliza principalmente en los siguientes contextos: -
1. Uso de super con variables:
Salida:-
Salida:-
3. Uso de super con constructores:
Salida:-
fuente
Constructores
En un constructor, puede usarlo sin un punto para llamar a otro constructor.
super
llama a un constructor en la superclase;this
llama a un constructor en esta clase:super
es útil si la superclase necesita inicializarse.this
es útil para permitirle escribir todo el código de inicialización duro solo una vez en uno de los constructores y llamarlo desde todos los otros constructores, mucho más fáciles de escribir.Métodos
En cualquier método, puede usarlo con un punto para llamar a otro método.
super.method()
llama a un método en la superclase;this.method()
llama a un método en esta clase:super
es útil en un determinado escenario: si su clase tiene el mismo método que su superclase, Java asumirá que desea el de su clase;super
le permite solicitar el método de la superclase en su lugar.this
es útil solo como una forma de hacer que su código sea más legible.fuente
La palabra clave super puede usarse para llamar al constructor de la superclase y para referirse a un miembro de la superclase
Cuando llama a super () con los argumentos correctos, en realidad llamamos al constructor Box , que inicializa las variables ancho , alto y profundidad , al que se hace referencia utilizando los valores de los parámetros correspondientes. Solo le queda inicializar su peso de valor agregado. Si es necesario, ahora puede hacer que las variables de clase Box sean privadas . Anote en los campos del modificador privado de clase Box y asegúrese de que puede acceder a ellos sin ningún problema.
En la superclase puede haber varios constructores de versiones sobrecargadas, por lo que puede llamar al método super () con diferentes parámetros. El programa realizará el constructor que coincide con los argumentos especificados.
fuente
super es una palabra clave. Se utiliza dentro de una definición de método de subclase para llamar a un método definido en la superclase. No se pueden llamar métodos privados de la superclase. Solo los métodos públicos y protegidos pueden ser llamados por la palabra clave super. También lo usan los constructores de clases para invocar a los constructores de su clase padre.
Verifique aquí para más explicaciones.
fuente
Como se indicó, dentro del constructor predeterminado hay un super () implícito llamado en la primera línea del constructor.
Este super () llama automáticamente a una cadena de constructores que comienza en la parte superior de la jerarquía de clases y se mueve hacia abajo en la jerarquía.
Si hubiera más de dos clases en la jerarquía de clases del programa, primero se llamaría al constructor predeterminado de la clase superior .
Aquí hay un ejemplo de esto:
Lo anterior generaría:
fuente