2

He estado haciendo algunos ejercicios y en la documentación oficial aparece el código de abajo.

Mi duda es: ¿por qué y cómo es posible hacer una instancia de la clase abstracta? Es decir, ¿por qué de esta manera sí es posible contener una instancia de un objeto en una variable de una clase abstracta?

abstract class Writer { 
  public static void write() { 
    System.out.println("Writing...");
  } 
} 

public class Programmer extends Writer { 
  public static void write() { 
    System.out.println("Writing code"); 
  } 

  public static void main(String[] args) { 
    Writer w = new Programmer(); 
    w.write(); 
  } 
}
  • Relacionada: https://es.stackoverflow.com/questions/228/clase-abstracta-con-constructor/231#231 – Pablo Lozano Feb 05 '19 at 08:21
  • También relacionada o duplicado de: https://es.stackoverflow.com/questions/227958/por-qu%C3%A9-se-puede-instanciar-esta-interfaz/227994#227994 – Pablo Lozano Feb 05 '19 at 14:15

2 Answers2

1

Una clase abstracta no se puede instanciar, debe ser extendida por otra clase que hereda sus métodos y propiedades, y que podrá o no ser instanciada.

Los métodos y propiedades no abstractos en una clase abstracta se heredan y pueden ser usados en igualdad de condiciones que si la herencia se hiciera de una clase normal.

La creación de una clase abstracta se usa normalmente para definir métodos que deberán ser implementados en las clases hijas (métodos declarados como abstractos en la clase padre). Las clases hijas están obligadas a implementar estos métodos heredados, teniendo por lo general implementaciones diferentes de los mismos.

Un ejemplo típico sería la clase Forma junto con otras clases concretas que heredan de ella, como Cuadrado, Triangulo, Circulo, ...

Orici
  • 7,269
  • 7
  • 35
  • 68
0

En este caso no está instanciando un objeto de tipo Writer sino de tipo Programmer, que extiende de writer pero no es abstracta.