Je voudrais savoir à quoi sert un constructeur pour une classe abstraite; comme nous n'instancions pas les classes abstraites, pourquoi aurions-nous besoin d'un tel constructeur?Quelle est l'utilité de créer un constructeur pour une classe abstraite en Java?
Répondre
Il y aura des moments où vous aurez une initialisation commune des variables d'instance que toutes les classes héritantes doivent mettre en place. Vous instanciez une classe abstraite lorsque vous l'étendez et cette classe concrète a un constructeur qui fournira les paramètres au constructeur de la classe abstraite.
Ils peuvent toujours être invoqués par les constructeurs de classes qui en héritent, ce qui fait du refactoring de code une bonne utilisation pour avoir un constructeur dans la classe abstraite.
Si vous avez des champs finaux non-initialisés dans une classe abstraite, vous devrez les initialiser dans un constructeur.
E.g.
abstract class A {
final int x;
}
ne compilera pas sans un constructeur qui attribue à x
.
Si votre classe ne déclare pas de constructeur, javac créera pour vous un constructeur sans-arg, do-nothing. Ensuite, lorsque votre sous-classe est initialisée, elle appelle le constructeur non-op généré et la vie est bonne. Cependant, si votre classe déclare un constructeur, javac n'en fera PAS un pour vous. Dans ce cas, le constructeur de la sous-classe doit appeler explicitement le constructeur de la classe parente. Sinon, vous ne parvenez pas à initialiser les membres de la classe parente, comme le mentionne la réponse ci-dessus.
Les constructeurs de classes abstraites sont utilisés par les sous-classes (invoquées à partir des constructeurs de sous-classes en utilisant super(params)
).
Vous devriez rendre ces constructeurs protected
pour que cela soit clair.
Vous n'instanciez pas les classes abstraites mais le constructeur est appelé lorsqu'une sous-classe est instanciée.
L'utilisation pourrait être d'initialiser des attributs communs ie.
import java.util.List;
import java.util.ArrayList;
abstract class BaseClass {
protected List list; // visible from subclasses
public BaseClass() {
System.out.println("to abstract...");
// common initialization to all subclasses
list = new ArrayList();
list.add("a");
list.add("a");
list.add("a");
}
}
class ConcreteClass extends BaseClass {
public ConcreteClass(){
// The list is initialized already
System.out.println("now it is concrete and the list is: = "+ this.list);
}
}
class TestAbstractClass {
public static void main(String [] args) {
BaseClass instance = new ConcreteClass();
}
}
Sortie
$ java TestAbstractClass
to abstract...
now it is concrete and the list is: = [a, a, a]
De-duplication des connaissances communes/comportement.
E.g. une voiture: toutes vos voitures seront construites avec un corps et quatre roues et un moteur. Donc vous faites cette partie de la construction dans le constructeur de la classe Car abstraite en appelant des fonctions comme Body(), Wheel (int x), Engine(). Chaque classe de voiture particulière aura sa propre implémentation de Body(), Wheel() et Engine() - mais tous feront les mêmes étapes pour construire la voiture à partir d'eux, il n'y a donc pas besoin de dupliquer ces étapes dans chacun de ces Des classes. Dans ce cas, vous implémentez ce comportement commun dans l'ancêtre.
Je suis d'accord, les constructeurs sont créés en supposant qu'il y aura des instances. Si vous avez beaucoup de code commun, vous pouvez penser à créer un constructeur, mais il est préférable de le mettre dans une méthode init()
.
c'est un mauvais conseil, alors chaque classe inheirting doit se souvenir d'appeler super.init() et il devient vite en désordre, c'est un conseil non standard et vraiment mauvais. –
- 1. Est-ce bon d'avoir un constructeur en classe abstraite?
- 2. Classe abstraite et constructeur
- 3. quelle est la classe abstraite en php?
- 4. Quelle est la pratique courante de terminer une classe abstraite?
- 5. Trouver quelle classe une classe abstraite est liée aux Ninject
- 6. constructeur Copie: copie en profondeur une classe abstraite
- 7. BareMessage = "Impossible de créer une classe abstraite."
- 8. Comment déclarer un constructeur par défaut pour la sous-classe de la classe abstraite?
- 9. Java - Classe abstraite pour contenir des variables?
- 10. Comment savoir si une classe Java est abstraite?
- 11. classe virtuelle en classe abstraite
- 12. Pourquoi y a-t-il un modificateur d'accès privé dans une classe abstraite en Java, même si nous ne pouvons pas créer une instance d'une classe abstraite?
- 13. Java polymorphisme/classe abstraite aide
- 14. Puis-je créer un constructeur non-explicite pour une classe Java?
- 15. Quelle est la bonne façon de créer une instance de classe Generic en Java?
- 16. Constructeur surchargé dans la classe abstraite dans vb.NET
- 17. Quelle est la différence entre une classe abstraite et une mixine?
- 18. Pourquoi une classe abstraite devrait-elle implémenter une méthode abstraite d'une classe de base abstraite?
- 19. Routage de formulaire Web - Impossible de créer une classe abstraite
- 20. Classe abstraite en C++
- 21. Créer une classe générique avec constructeur interne
- 22. Impossible de créer une instance de classe abstraite
- 23. Non résolu externe (constructeur de classe abstraite/destructeur)
- 24. Comment faire pour mapper une classe abstraite avec un XML simple en Java?
- 25. Obtention du constructeur par défaut d'une classe abstraite générique
- 26. Comment implémenter une classe abstraite en F #?
- 27. classe abstraite refactorisation en C#
- 28. Est-il possible de créer une classe d'usine en PHP?
- 29. interface Java et l'émission classe abstraite
- 30. Constructeur avec un tableau de sous-classes d'une classe abstraite en tant que paramètre
Un exemple est javax.swing.AbstractAction –