web-dev-qa-db-fra.com

Pourquoi les classes abstraites de Java ont-elles des constructeurs?

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?

55
gameover

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.

79
Uri

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.

10
Debmalya

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.

10
Upul Bandara

Parce qu'une autre classe pourrait l'étendre et que la classe enfant doit invoquer un constructeur de superclasse.

7
Richard JP Le Guen

Parce que les classes abstraites ont des (champs) statiques et parfois elles doivent être initialisées d'une manière ou d'une autre.

4
Andriy Sholokh

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éé.

3
Mandroid

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, ...);
     ...
  }
}

1
manuel aldana