Pourquoi une classe abstract
dans Java a-t-elle un constructor
?
Que construit-il, car nous ne pouvons pas instancier une classe abstract
?
Des pensées?
Un constructeur dans Java ne "construit" pas réellement l'objet, il est utilisé pour initialiser les champs.
Imaginez que votre classe abstraite ait les champs x et y et que vous souhaitiez toujours qu'ils soient initialisés d'une certaine manière, quelle que soit la sous-classe concrète réelle qui sera finalement créée. Vous créez donc un constructeur et initialisez ces champs.
Maintenant, si vous avez deux sous-classes différentes de votre classe abstraite, lorsque vous les instanciez, leurs constructeurs seront appelés, puis le constructeur parent sera appelé et les champs seront initialisés.
Si vous ne faites rien, le constructeur par défaut du parent sera appelé. Cependant, vous pouvez utiliser le super mot clé pour appeler un constructeur spécifique sur la classe parente.
Deux raisons à cela:
1) Les classes abstraites ont constructors
et ces constructeurs sont toujours invoqués lorsqu'une sous-classe concrète est instanciée. Nous savons que lorsque nous allons instancier une classe, nous utilisons toujours le constructeur de cette classe. Désormais, chaque constructeur invoque le constructeur de sa super classe avec un appel implicite à super()
.
2) Nous savons que les constructeurs sont également utilisés pour initialiser les champs d'une classe. Nous savons également que les classes abstraites peuvent contenir des champs et parfois elles doivent être initialisées d'une manière ou d'une autre à l'aide du constructeur.
Toutes les classes, y compris les classes abstraites, peuvent avoir des constructeurs. Les constructeurs de classes abstraites seront appelés lorsque sa sous-classe concrète sera instanciée.
Parce qu'une autre classe pourrait l'étendre et que la classe enfant doit invoquer un constructeur de superclasse.
Parce que les classes abstraites ont des (champs) statiques et parfois elles doivent être initialisées d'une manière ou d'une autre.
Je suppose que la racine de cette question est que les gens croient qu'un appel à un constructeur crée l'objet. Ce n'est pas le cas. Java ne prétend nulle part qu'un appel de constructeur crée un objet. Il fait juste ce que nous voulons que le constructeur fasse, comme initialiser certains champs ... c'est tout. Ainsi, le constructeur d'une classe abstraite appelé ne signifie pas que son objet est créé.
En termes d'implémentation, vous verrez souvent à l'intérieur de l'instruction super () dans les constructeurs de sous-classes, quelque chose comme:
public class A extends AbstractB{
public A(...){
super(String constructorArgForB, ...);
...
}
}