web-dev-qa-db-fra.com

Peut-on instancier directement une classe abstraite?

J'ai lu que nous ne pouvons instancier une classe abstraite qu'en l'héritant, mais nous ne pouvons pas l'instancier directement.
Cependant, j'ai vu que nous pouvons créer un objet avec le type d'une classe abstraite en appelant une méthode d'une autre classe.
Par exemple - LocationProvider est une classe abstraite, et nous pouvons l'instancier en appelant la fonction getProvider() dans la classe LocationManager:

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

Comment la classe abstraite est-elle instanciée ici?

35
satheesh.droid

Vous ne pouvez pas instancier directement une classe abstraite, mais vous pouvez créer une classe anonyme lorsqu'il n'y a pas de classe concrète:

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

Cela fonctionne également avec les interfaces.

82
kiritsuku

Non, vous ne pouvez jamais instancier une classe abstraite. C'est le but d'une classe abstraite. La méthode getProvider à laquelle vous faites référence renvoie une implémentation spécifique de la classe abstraite. C'est le modèle abstrait de l'usine.

22
Darin Dimitrov

Non, la classe abstraite ne peut jamais être instanciée.

5
Prateek Jain

Selon d'autres, vous ne pouvez pas instancier à partir d'une classe abstraite. mais il existe 2 façons de l'utiliser. 1. créer une autre classe non-abstraite qui s'étend de la classe abstraite. Vous pouvez donc instancier à partir d'une nouvelle classe et utiliser les attributs et les méthodes dans la classe abstraite.

    public class MyCustomClass extends YourAbstractClass {

/// attributes, methods ,...
}
  1. travailler avec des interfaces.
0
Haniyeh Khaksar