Categorías
Classes & Interfaces

¿Constructores de sub y súper clases en Java?

Esta publicación resume una pregunta común sobre los constructores de Java.

1. ¿Por qué la creación de un objeto de la subclase invoca también al constructor de la superclase?

class Super {
    String s;
 
    public Super(){
    	System.out.println("Super");
    }
}
 
public class Sub extends Super {
 
    public Sub(){
    	System.out.println("Sub");
    }
 
    public static void main(String[] args){
    	Sub s = new Sub();
    }
}

Imprime:

Super
Sub

Cuando se hereda de otra clase, primero se debe llamar a super () en el constructor. De lo contrario, el compilador insertará esa llamada. Esta es la razón por la que el superconstructor también se invoca cuando se crea un objeto Sub.

Esto no crea dos objetos, solo un objeto Sub. La razón para llamar al superconstructor es que si la superclase podría tener campos privados que deben ser inicializados por su constructor.

Después de que el compilador inserta el superconstructor, el constructor de la subclase tiene el siguiente aspecto:

    public Sub(){
    	super();
    	System.out.println("Sub");
    }

2. Un mensaje de error común: el superconstructor implícito no está definido para el constructor predeterminado

Este es un mensaje de error de compilación visto por muchos desarrolladores de Java:

«El superconstructor implícito no está definido para el constructor predeterminado. Debe definir un constructor explícito»

Este error de compilación se produce porque el superconstructor predeterminado no está definido. En Java, si una clase no define un constructor, el compilador insertará un constructor sin argumentos predeterminado para la clase por defecto. Si un constructor está definido en la clase Super, en este caso Super (String s), el compilador no insertará el constructor sin argumentos predeterminado. Esta es la situación de la clase Super anterior.

  ¿Cuándo usar constructores privados en Java?

Los constructores de la clase Sub, ya sea con argumento o sin argumento, llamarán al superconstructor sin argumento. Dado que el compilador intenta insertar super () en los 2 constructores de la clase Sub, pero el constructor predeterminado de Super no está definido, el compilador informa el mensaje de error.

Para solucionar este problema, simplemente 1) agregue un constructor Super () a la clase Super como

public Super(){
    System.out.println("Super");
}

, o 2) eliminar el superconstructor autodefinido, o 3) agregar super(value) a los subconstructores.

3. Llamar explícitamente al superconstructor en el subconstructor

El siguiente código está bien:

subconstructor-con-parámetro

El subconstructor llama explícitamente al superconstructor con parámetro. El superconstructor está definido y es bueno invocarlo.

4. La regla

En resumen, las reglas son: el constructor de la subclase tiene que invocar al instructor de la superclase, ya sea explícitamente por el programador o implícitamente por el compilador. De cualquier manera, se debe definir el superconstructor invocado.

5. La pregunta interesante

¿Por qué Java no proporciona un constructor predeterminado, si la clase tiene un constructor con parámetro (s)?

Algunas respuestas: http://stackoverflow.com/q/16046200/127859

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *