¿Por qué las clases abstractas en Java tienen constructores?

¿Por qué una clase abstract en Java tiene un constructor ?

¿Qué está construyendo, ya que no podemos instanciar una clase abstract ?

¿Alguna idea?

Un constructor en Java en realidad no “crea” el objeto, sino que se usa para inicializar campos.

Imagine que su clase abstracta tiene los campos xey, y que siempre quiere que se inicialicen de cierta manera, sin importar qué subclase concreta real se cree. Entonces usted crea un constructor e inicializa estos campos.

Ahora, si tiene dos subclases diferentes de su clase abstracta, cuando las cree, se invocarán sus constructores, se llamará al constructor padre y se inicializarán los campos.

Si no hace nada, se llamará al constructor predeterminado del padre. Sin embargo, puede usar la palabra clave super para invocar un constructor específico en la clase principal.

Todas las clases, incluidas las clases abstractas, pueden tener constructores. Se invocarán constructores de clases abstractas cuando se creará una instancia de la subclase concreta.

Dos razones para esto:

1) Las clases abstractas tienen constructors y esos constructores siempre se invocan cuando se crea una instancia de una subclase concreta. Sabemos que cuando vamos a instanciar una clase, siempre usamos el constructor de esa clase. Ahora cada constructor invoca el constructor de su superclase con una llamada implícita a super() .

2) Sabemos que el constructor también se usa para inicializar campos de una clase. También sabemos que las clases abstractas pueden contener campos y, a veces, deben inicializarse de alguna manera mediante el uso de constructor .

Porque otra clase podría extenderlo, y la clase hija necesita invocar un constructor de superclase.

Debido a que las clases abstractas tienen estado (campos) y algunas veces deben inicializarse de alguna manera.

Supongo que la raíz de esta pregunta es que la gente cree que una llamada a un constructor crea el objeto. Ese no es el caso. Java en ninguna parte afirma que una llamada de constructor crea un objeto. Simplemente hace lo que queremos que haga el constructor, como inicializar algunos campos … eso es todo. Por lo tanto, el llamado de un constructor de una clase abstracta no significa que se haya creado su objeto.

En lo que respecta a la implementación, a menudo verá dentro de la instrucción super () en los constructores de subclases algo así como:

public class A extends AbstractB{ public A(...){ super(String constructorArgForB, ...); ... } }
public class A extends AbstractB{ public A(...){ super(String constructorArgForB, ...); ... } }