¿Puede una clase abstracta
de Java tener constructor
?
Y si es así ¿Qué fines tiene?
¿Puede una clase abstracta
de Java tener constructor
?
Y si es así ¿Qué fines tiene?
Respuesta corta: SI, las clases abstractas pueden tener constructores, pero SOLAMENTE para ser usados desde los constructores de las clases hijas, no puedes usarlos directamente porque por definicion JLS (§8.1.1.1)
no se puede instanciar una clase abstracta.
Explicacion de uso
Piensa en el caso de una clase abstracta donde tengas que inicializar sus atributos. Si tuvieras un constructor vacío se haria implicitamente en la clase hija, en caso contrario debemos usar super(param1, param2);
para especificarlo. Un constructor con parametros en una clase abstracta, lo que hace es forzar a la clase hija a especificar parametros.
Ejemplo practico:
abstract class Persona {
private String nombre;
// declaracion del constructor de la clase abstracta por lo que implicitamente
//estamos omitiendo el constructor por defecto public Person() obligando a las
// clases hijas a llamar a este constructor con parametros.
public Person(String nombre) {
this.nombre = nombre;
}
}
class Estudiante extends Persona {
public Estudiante(String nombre) {
// uso del constructor de la clase abstracta
super(nombre);
}
}
// finalmente puedes realizar la abstraccion con Estudiante y Persona
Person p = new Estudiante("Manuel");
Claro que puede:
abstract class Producto {
int multiplicadoPor;
public Producto( int multiplicadoPor ) {
this.multiplicadoPor = multiplicadoPor;
}
public int multiplicar(int valor) {
return multiplicadoPor * valor;
}
}
class MultiplicadoPorDos extends Producto {
public MultiplicadoPorDos() {
super(2);
}
}
class MultiplicadoPorX extends Producto {
public MultiplicadoPorX(int x) {
super(x);
}
}
Las clases abstractas siempre tienen un constructor. Si no especificas uno entonces se le crea uno por defecto y sin argumentos, como ocurre con cualquier otra clase. De hecho, TODAS las clases, incluyendo clases anidadas y anónimas, tendrán un constructor por defecto si no se especifica uno (en el caso de clases anónimas es imposible especificar una asi que siempre tendrás el constructor creado por defecto).
El contructor de las clases abstractas se comporta de igual manera que cualquier otro constructor, la diferencia es que estas clases no pueden ser directamente instanciadas solo extendidas.
Referencia:
En una clase para que sea abstracta necesita por lo menos tener un método abstracto.
La idea de que una clase sea abstracta es que posea métodos abstractos para poder ser implementados y sobrescritos por las clases que hereden de la clase abstracta y así aplicar, si lo requiere la lógica del negocio, el polimorfismo.