Можем ли мы создать экземпляр абстрактного класса напрямую?

Я прочитал, мы можем только создать экземпляр абстрактного класса, наследуя его, но мы не можем его создать напрямую.
Однако я видел, что мы можем создать объект с типом абстрактного класса, вызвав метод другого класса. Например, LocationProvider является абстрактным классом, и мы можем его создать, вызвав функцию getProvider() в классе LocationManager:

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

Как здесь создается экземпляр абстрактного класса?

Ответ 1

Вы не можете напрямую создать абстрактный класс, но вы можете создать анонимный класс, если нет конкретного класса:

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");
    }
}

Это также работает с интерфейсами.

Ответ 2

Нет, вы никогда не сможете создать абстрактный класс. Это цель абстрактного класса. Метод getProvider, на который вы ссылаетесь, возвращает определенную реализацию абстрактного класса. Это абстрактный шаблон factory.

Ответ 3

Нет, абстрактный класс никогда не может быть создан.

Ответ 4

По словам других, вы не можете создавать экземпляр из абстрактного класса. но существует два способа его использования. 1. Сделайте еще один класс без абзаца, который простирается от абстрактного класса. Таким образом, вы можете создавать экземпляр нового класса и использовать атрибуты и методы в абстрактном классе.

    public class MyCustomClass extends YourAbstractClass {

/// attributes, methods ,...
}
  1. работа с интерфейсами.