2011-06-11 21 views
95

Digamos que tengo una subclase que extiende una superclase. ¿En qué escenarios necesito escribir explícitamente super() para obtener el constructor de la superclase para que se ejecute?¿Cuándo necesita llamar explícitamente a un constructor de superclase?

Estoy viendo un ejemplo en un libro sobre clases abstractas y cuando lo amplían con una subclase no abstracta, el constructor predeterminado de la subclase está en blanco y hay un comentario que dice que se llamará al constructor predeterminado de la superclase. Al mismo tiempo, también he visto instancias aquí donde el problema de alguien no estaba llamando explícitamente al super().

¿La distinción hace referencia al constructor predeterminado/no predeterminado de la superclase del constructor predeterminado/no predeterminado de la subclase?

+0

Soy yo o ninguna de las respuestas responde a la pregunta "¿por qué necesitas llamar a un constructor de superclase 'en una subclase? –

Respuesta

137

Usted no necesita sólo

super(); 

Eso es lo que va a estar allí si no se especifica otra cosa. Usted única necesario que especifique el constructor para llamar si:

  • usted desea llamar a un constructor de la superclase que tiene parámetros
  • ¿Quieres cadena a otro constructor de la misma clase en lugar del constructor de la superclase

usted afirma que:

al mismo tiempo, también he visto casos en donde aquí el problema de alguien no se explic Llamando a super().

¿Podría dar algún ejemplo? No me puedo imaginar cómo es posible ...

+4

Sí, debería haber sido más claro. Fue super (con argumentos). Gracias por tu respuesta. – jhlu87

+0

Tienes razón. Pero sobre esto: 'Al mismo tiempo, también he visto casos aquí donde el problema de alguien no era explícitamente llamar super()'. Esto sucede cuando el constructor padre no tiene un constructor noarg. En ese caso, si no llama explícitamente a super() obtendrá un error. – ACV

+1

@ACV: Llamar explícitamente a 'super()' tampoco funcionará allí. Llamar a un superconstructor * con una lista de argumentos no vacíos * funcionaría, pero simplemente usar 'super()' no lo haría. –

10

Si no llama explícitamente a un superconstructor, se llamará al argumento less constructor (super()). Esto significa que usted tiene que llamar a un constructor específico usted mismo si no hay un constructor alcanzable sin argumento de la superclase.

Pero con frecuencia quiere un constructor diferente, incluso si pudiera usar el constructor predeterminado, depende de su código.

También tenga en cuenta que si no se declara ningún constructor, el compilador genera automáticamente un constructor público predeterminado, pero tan pronto como escriba su propio constructor, esto ya no ocurre.

+1

Solo para asegurarte de que entiendo. Si en mi superclase, tengo un constructor y no es el constructor predeterminado (digamos que toma un parámetro). Entonces, en mi constructor para mi subclase, ¿debo llamar explícitamente a super (param) porque el compilador ya no generará un constructor predeterminado para la superclase? – jhlu87

+1

@ jhlu87, corregir – bestsss

4

El método super() siempre se llama en los constructores de subclases, incluso si no está escrito explícitamente en el código.

La única vez que necesita escribirlo, es si hay varios métodos super(...) en la superclase con diferentes parámetros de inicialización.

+5

"La única vez que necesita escribirlo es si hay varios métodos super (...) en la superclase con diferentes parámetros de inicialización". No es verdad. Siempre que haya un argumento accesible menos constructor, puede tener cientos de otros constructores sin ningún problema. – Voo

Cuestiones relacionadas