2010-01-31 20 views
51

¿Por qué una clase abstract en Java tiene un constructor?¿Por qué las clases abstractas en Java tienen constructores?

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

¿Alguna idea?

+1

echa un vistazo a esta pregunta para aclaración, http://stackoverflow.com/questions/260666/abstract-class-constructor-in-java –

+0

Necesita una forma de construir subclase de una clase abstracta. Técnicamente, un constructor público en una clase abstracta es realmente solo un constructor protegido. –

Respuesta

70

Un constructor en Java en realidad no "construir" el objeto, que se utiliza 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 finalmente. Entonces usted crea un constructor e inicializa estos campos.

Ahora, si tiene dos subclases diferentes de su clase abstracta, al instanciarlas 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.

+4

Normalmente, si tiene en cuenta la teoría del encadenamiento de constructores, primero se llama al constructor padre antes de que el constructor hijo ejecute – Stranger

+0

'Ahora, si tiene dos subclases diferentes de su clase abstracta, cuando las cree se llamarán sus constructores , y luego se llamará al constructor padre y los campos se inicializarán. ¿Quiere decir que se llamará al primer constructor de clases de niños? : O – UnKnown

+0

Cada vez que fluye así: 'constructor gran padre' ->' constructor padre' -> 'constructor hijo' –

7

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

9

Todas las clases que incluyen las clases abstractas pueden tener constructores de clase constructors.Abstract serán llamados cuando su subclase concreta se creará una instancia

1

Implementación sabia que a menudo se puede ver dentro súper declaración() en las subclases constructores, algo así como:

 

public class A extends AbstractB{ 

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

 
4

Debido a que las clases abstractas tienen estatales (campos) y somethimes que necesitan para ser inicializado de alguna manera.

7

dos razones para esto:

1) Las clases abstractas tienen constructors y los 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 al 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 ser inicializadas de alguna manera mediante el constructor.

+0

Debmalya Das (SCJP y SCWCD) – Debmalya

2

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.

Cuestiones relacionadas