22

¿Puede una clase abstracta de Java tener constructor ?

Y si es así ¿Qué fines tiene?

Nicolás
  • 751
  • 7
  • 19
Santi92
  • 1,651
  • 3
  • 14
  • 34

3 Answers3

27

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");
Jordi Castilla
  • 7,189
  • 10
  • 35
  • 60
  • Tienes razón Jordi, lo que pasa que muchos estan haciendo eso. Además no se porque todos arrancan con 100, ya borre mi respuesta. – Santi92 Dec 02 '15 at 13:16
  • arrancamos con 100 porque tenemos reputacion en otros foros de stackechange, yo lo siento, pero pienso gastar toda la reputacion necesaria para impedir estas practicas, yo por ejemplo, he hecho una cosa parecida aqui http://es.stackoverflow.com/questions/225/como-comparar-strings-en-java pero porque considero que es una pregunta / respuesta que debe estar en este foro como muchas otras, pero sin copiar, son cosas faciles de responder, no es necesario copiar y con contenido original haremos de esta comunidad un sitio con mas calidad – Jordi Castilla Dec 02 '15 at 13:21
  • Bien entendido Jordi, gracias por la aclaración de los 100 pts. Yo también pienso igual que usted, sólo que todavia no tengo reputación para moderar sobre esos temas. Saludos y gracias por su respuesta – Santi92 Dec 02 '15 at 13:24
  • Exactamente lo mismo, por cierto, aplica en .NET – Konamiman Dec 03 '15 at 09:04
3

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:

César
  • 16,990
  • 6
  • 37
  • 76
  • 1
    En el caso de clases anónimas, no puedes agregarle un constructor pero puedes agregar un bloque de inicialización que funciona como una especie de constructor. –  Feb 25 '16 at 03:58
1

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.

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
Renny
  • 55
  • 7