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?
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.
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.
Non, la classe abstraite ne peut jamais être instanciée.
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 ,...
}