Saltar al contenido

¿Una clase principal siempre necesita un constructor predeterminado o sin argumentos, incluso si la clase secundaria ya tiene un constructor definido?

Si hallas algún problema en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.

Solución:

¿Tengo razón al concluir que una clase principal siempre necesita un constructor predeterminado o sin argumentos?

No. Lo primero que debe hacer un constructor de subclase es invocar a uno de los constructores de superclase. Si no lo hace, entonces el compilador llama al constructor sin argumentos de la superclase por usted. Pero, por supuesto, eso falla si la superclase no tiene uno.

Su código debe ser:

class Pony extends Horse 
    Pony(int age) 
        super(age);
    

Mira, la superclase ya tiene un campo de edad y probablemente métodos que usan ese campo. Entonces, volver a declarar uno en la subclase es incorrecto y contraproducente.

Para hacerlo compilar necesitas llamar super(int) en lugar de llamar super() implícitamente.

Pony(int age) 
    super(age);
    this.age = age;

Entonces puedes notar que ambos Horse y Pony tienen exactamente el mismo campo que contiene exactamente los mismos datos. ¿Por qué Pony necesito tener el campo age si la clase Pony está basado en (Horse) ya definió este campo?

Pony(int age) 
    super(age);

Es la belleza de la herencia: puede hacer uso de cualquier cosa que ya esté escrita en la clase base.


Sin embargo, el compilador se queja de que la clase principal no tiene un constructor predeterminado.

Se queja porque, como mencioné anteriormente, no pudo invocar super().

Si el cuerpo de un constructor no comienza con una invocación de constructor explícita y el constructor que se declara no es parte de la clase primordial Objeto, entonces el cuerpo del constructor comienza implícitamente con una invocación de constructor de superclase “super();”, una invocación del constructor de su superclase directa que no acepta argumentos.

https://docs.oracle.com/javase/specs/jls/se12/html/jls-8.html#jls-8.8.7


¿Qué sucede si quiero que la clase principal y secundaria solo tengan constructores con parámetros?

Luego, la clase secundaria siempre debe indicar explícitamente a qué constructor principal quiere llamar.


¿Tengo razón al concluir que una clase principal siempre necesita un constructor predeterminado o sin argumentos?

No, está bien tener una clase principal sin el constructor predeterminado siempre que sus hijos no invoquen super().

Te mostramos las reseñas y valoraciones de los lectores

Te invitamos a corroborar nuestro trabajo ejecutando un comentario y valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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