2010-01-20 25 views

Respuesta

9

habrá ocasiones en las que tenga una inicialización común de variables de instancia que todas las clases heredadas necesitan configurar. Instancias una clase abstracta cuando la extiendes y esa clase concreta tiene un constructor que proporcionará los parámetros al constructor de la clase abstracta.

+2

Un ejemplo es javax.swing.AbstractAction –

5

Todavía pueden ser invocados por los constructores de clases que heredan de aquél, haciendo que la refactorización de código sea un buen uso para tener un constructor en la clase abstracta.

3

Si tiene campos finales no inicializados en una clase abstracta, deberá inicializarlos en un constructor.

E.g.

abstract class A { 
    final int x; 
} 

no se compilará sin un constructor que asigna a x.

3

Si su clase no declara un constructor, javac creará un constructor no-arg, do-nothing para usted. Luego, cuando su subclase se inicialice, llamará al constructor no operativo generado y la vida es buena.

Sin embargo, si su clase declara cualquier constructor, javac NO lo hará por usted. En ese caso, el constructor de la subclase necesita llamar explícitamente al constructor de la clase padre. De lo contrario, no podrá inicializar a los miembros de la clase principal, como se menciona en la respuesta anterior.

2

Los constructores para clases abstractas son utilizados por subclases (invocados desde constructores de subclases usando super(params)).

Debe hacer estos constructores protected para dejar eso en claro.

2

No crea instancias de clases abstractas pero el constructor se invoca cuando se crea una instancia de una subclase.

El uso podría ser para inicializar atributos comunes, es decir.

import java.util.List; 
import java.util.ArrayList; 
abstract class BaseClass { 
    protected List list; // visible from subclasses 

    public BaseClass() { 
     System.out.println("to abstract..."); 
     // common initialization to all subclasses 
     list = new ArrayList(); 
     list.add("a"); 
     list.add("a"); 
     list.add("a"); 
    } 
} 

class ConcreteClass extends BaseClass { 
    public ConcreteClass(){ 
     // The list is initialized already 
     System.out.println("now it is concrete and the list is: = "+ this.list); 


    } 
} 

class TestAbstractClass { 
    public static void main(String [] args) { 
     BaseClass instance = new ConcreteClass(); 
    } 

} 

salida

$ java TestAbstractClass 
to abstract... 
now it is concrete and the list is: = [a, a, a] 
1

De-duplicación de conocimiento/comportamiento común.

E.g. un auto: todos sus autos se construirán con un cuerpo y cuatro ruedas y un motor. Así que haces esta parte de la construcción en el constructor de la clase abstracta Car llamando funciones como Body(), Wheel (int x), Engine(). Cada clase de vehículo particular tendrá su propia implementación de Cuerpo(), Rueda() y Motor(), pero todos harán los mismos pasos para construir el auto con ellos, por lo que no es necesario duplicar esos pasos en cada uno de ellos. clases En este caso, implementa ese comportamiento común en el ancestro.

-1

Acepto, los constructores se crean suponiendo que habrá instancias. Si tiene muchos códigos comunes, puede pensar en crear un Constructor, pero es mucho mejor ponerlo en un método init().

+1

esto es un mal consejo, entonces cada clase de in-timeing necesita recordar llamar a super.init() y se vuelve desordenado rápido, este es un consejo no estándar y realmente malo. –

Cuestiones relacionadas