Can we instantiate an abstract class directly?


I have read we can only instantiate an abstract class by inheriting it, but we cannot instantiate it directly.
However, I saw we can create an object with the type of an abstract class by calling a method of another class.
For example - LocationProvider is an abstract class, and we can instantiate it by calling getProvider() function in the LocationManager class:

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

How is the abstract class instantiate here?

6/7/2019 3:14:59 PM

Accepted Answer

You can't directly instantiate an abstract class, but you can create an anonymous class when there is no concrete class:

public class AbstractTest {
    public static void main(final String... args) {
        final Printer p = new Printer() {
            void printSomethingOther() {
            public void print() {
                printSomethingOther(); // works fine
        //p.printSomethingOther(); // does not work

abstract class Printer {
    public void print() {

This works with interfaces, too.

1/2/2011 5:58:53 PM

No, you can never instantiate an abstract class. That's the purpose of an abstract class. The getProvider method you are referring to returns a specific implementation of the abstract class. This is the abstract factory pattern.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow