¿Podemos instanciar una clase abstracta?

He leído que solo podemos instanciar una clase abstracta al heredarla, pero no podemos crear una instancia directamente.
Sin embargo, vi que podemos crear un objeto con el tipo de una clase abstracta llamando a un método de otra clase.
Por ejemplo, LocationProvider es una clase abstracta y podemos instanciarla llamando a la función getProvider() en la clase LocationManager :

 LocationManager lm = getSystemService(Context.LOCATION_PROVIDER); LocationProvider lp = lm.getProvider("gps"); 

¿Cómo es la instancia de la clase abstracta aquí?

No puedes instanciar directamente una clase abstracta, pero puedes crear una clase anónima cuando no hay una clase concreta:

 public class AbstractTest { public static void main(final String... args) { final Printer p = new Printer() { void printSomethingOther() { System.out.println("other"); } @Override public void print() { super.print(); System.out.println("world"); printSomethingOther(); // works fine } }; p.print(); //p.printSomethingOther(); // does not work } } abstract class Printer { public void print() { System.out.println("hello"); } } 

Esto funciona con interfaces, también.

No, nunca puedes crear una instancia de una clase abstracta. Ese es el propósito de una clase abstracta. El método getProvider que se refiere devuelve una implementación específica de la clase abstracta. Este es el patrón abstracto de fábrica.

No, la clase abstracta nunca puede ser instanciada.

Según dijeron otros, no se puede crear una instancia a partir de una clase abstracta. pero existe 2 formas de usarlo. 1. hacer otra clase no-abstracta que se extiende desde la clase abstracta. Entonces puede crear instancias de una nueva clase y usar los atributos y métodos en la clase abstracta.

  public class MyCustomClass extends YourAbstractClass { /// attributes, methods ,... } 
  1. trabajar con interfaces
    Intereting Posts