Question Une classe abstraite peut-elle avoir un constructeur?


Une classe abstraite peut-elle avoir un constructeur?

Si oui, comment peut-il être utilisé et à quelles fins?


481
2017-11-04 02:46


origine


Réponses:


Oui, une classe abstraite peut avoir un constructeur. Considère ceci:

abstract class Product { 
    int multiplyBy;
    public Product( int multiplyBy ) {
        this.multiplyBy = multiplyBy;
    }

    public int mutiply(int val) {
       return multiplyBy * val;
    }
}

class TimesTwo extends Product {
    public TimesTwo() {
        super(2);
    }
}

class TimesWhat extends Product {
    public TimesWhat(int what) {
        super(what);
    }
}

La superclasse Product est abstrait et a un constructeur. La classe concrète TimesTwo a un constructeur qui ne fait que coder en dur la valeur 2. La classe concrète TimesWhat a un constructeur qui permet à l'appelant de spécifier la valeur.

Les constructeurs abstraits seront fréquemment utilisés pour appliquer des contraintes de classe ou des invariants tels que les champs minimum requis pour configurer la classe.

NOTE: Comme il n'y a pas de constructeur par défaut (ou sans-arg) dans le parent   classe abstraite, le constructeur utilisé dans la sous-classe doit explicitement appeler   le constructeur parent.


515
2017-11-04 03:19



Vous devez définir un constructeur dans une classe abstraite si vous êtes dans l'une des situations suivantes:

  • vous voulez effectuer quelques initialisation (aux champs de classe abstraite) avant le instanciation d'une sous-classe en fait se déroule
  • vous avez défini les derniers champs dans le classe abstraite, mais vous ne l'avez pas les initialiser dans la déclaration lui-même; dans ce cas, vous devez avoir un constructeur pour les initialiser des champs

Notez que:

  • vous pouvez définir plus d'un constructeur (avec différents arguments)
  • vous pouvez (devrait?) définir tous vos constructeurs protégés (les rendant le public est inutile de toute façon)
  • votre constructeur de sous-classe peut appeler un constructeur de l'abstrait classe; il peut même devoir appeler (s'il n'y a pas de constructeur no-arg dans le cours de résumé)

Dans tous les cas, n'oubliez pas que si vous ne définissez pas un constructeur, le compilateur en générera automatiquement un pour vous (celui-ci est public, n'a pas d'argument, et ne fait rien).


133
2017-11-04 07:30



Oui, il peut avoir un constructeur et il est défini et se comporte exactement comme le constructeur d'une autre classe. Sauf que les classes abstraites ne peuvent pas être directement instanciées, seulement étendues, donc l'utilisation est toujours à partir du constructeur d'une sous-classe.


50
2017-11-04 02:59



Oui! Les classes abstraites peuvent avoir des constructeurs!

Oui, lorsque nous définissons une classe comme une classe abstraite, elle ne peut pas être instanciée, mais cela ne signifie pas qu'une classe abstraite ne peut pas avoir de constructeur. Chaque classe abstraite doit avoir une sous-classe concrète qui implémentera les méthodes abstraites de cette classe abstraite.

Lorsque nous créons un objet de n'importe quelle sous-classe, tous les constructeurs de l'arbre d'héritage correspondant sont appelés dans l'approche du haut vers le bas. Le même cas s'applique aux classes abstraites. Bien que nous ne puissions pas créer un objet d'une classe abstraite, lorsque nous créons un objet d'une classe qui est concrète et sous-classe de la classe abstraite, le constructeur de la classe abstraite est automatiquement appelé. Nous pouvons donc avoir un constructeur dans les classes abstraites.

Note: Une classe non abstraite ne peut pas avoir de méthode abstraite mais une classe abstraite peut avoir une méthode non abstraite. La raison est similaire à celle des constructeurs, la différence étant d'être appelée automatiquement, nous pouvons appeler super (). De plus, il n'y a rien comme un constructeur abstrait car cela n'a aucun sens.


29
2018-05-18 10:37



Non seulement peut-il, il le fait toujours. Si vous n'en spécifiez pas un, il n'a pas de constructeur arg, par défaut, comme toute autre classe. En fait, TOUTES les classes, y compris les classes imbriquées et anonymes, obtiendront un constructeur par défaut si aucun n’est spécifié (dans le cas des classes anonymes, il est impossible d’en spécifier une, vous obtiendrez donc toujours le constructeur par défaut).

Un bon exemple de classe abstraite ayant un constructeur est le Calendrier classe. Vous obtenez un objet Calendar en appelant Calendar.getInstance (), mais des constructeurs sont également protégés. La raison pour laquelle ses constructeurs sont protégés est que seules ses sous-classes peuvent les appeler (ou les classes dans le même paquet, mais puisque c'est abstrait, cela ne s'applique pas). Calendrier Grégorien est un exemple de classe qui étend Calendar.


12
2017-09-12 02:46



Oui, les constructeurs de classes abstraites sont généralement utilisés pour les super appels pour les événements d'initialisation communs à toutes les sous-classes


5
2017-07-21 04:56



Une classe abstraite peut avoir un constructeur MAIS vous ne pouvez pas créer un objet de classe abstraite alors comment utilisez-vous ce constructeur?

Chose est quand vous héritez de cette classe abstraite dans votre sous-classe, vous pouvez passer des valeurs à son constructeur (abstrait) grâce à la méthode super (valeur) dans votre sous-classe et non vous n'héritez pas un constructeur.

Donc en utilisant super, vous pouvez passer des valeurs dans un constructeur de la classe abstraite et autant que je me souvienne, il doit être la première déclaration dans votre méthode ou constructeur.


5
2017-11-30 08:07



Bien qu'il y ait beaucoup de bonnes réponses, je voudrais donner mes 2 cents.

Constructeur NE CONSTRUIT PAS L'OBJET. Il est utilisé pour initialiser un objet.

Oui, une classe abstraite a toujours un constructeur. Si vous ne définissez pas votre propre constructeur, le compilateur donnera un constructeur par défaut à la classe Abstract. Ci-dessus est vrai pour toutes les classes - imbriquées, abstraites, anonymes, etc.

Une classe abstraite (contrairement à l'interface) peut avoir des champs non statiques non finaux nécessitant une initialisation. Vous pouvez écrire votre propre constructeur dans la classe abstraite pour le faire. Mais, dans ce cas, il n'y aura pas de constructeur par défaut.

public abstract class Abs{
    int i;
    int j;
    public Abs(int i,int j){
        this.i = i;
        this.j = j;
        System.out.println(i+" "+j);
    }
}

Faites attention en étendant au-dessus de la classe abstraite, vous devez appeler explicitement super de chaque constructeur. La première ligne de n'importe quel constructeur appelle super (). Si vous n'appelez pas explicitement super (), Java le fera pour vous. Le code ci-dessous ne compilera pas:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    System.out.println("2 arg");
}
}

Vous devez l'utiliser comme ci-dessous exemple:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    super(i,j);
    System.out.println("2 arg");
}
}

4
2017-09-06 12:36



Considère ceci:

abstract class Product { 
    int value;
    public Product( int val ) {
        value= val;
    }
    abstract public int multiply();
}

class TimesTwo extends Product {
    public int mutiply() {
       return value * 2;
    }
}

La superclasse est abstraite et a un constructeur.


3
2017-11-04 02:52



Bien sûr, la classe abstraite peut avoir un constructeur. Généralement, le constructeur de la classe est utilisé pour initialiser les champs. Ainsi, un constructeur de classe abstraite est utilisé pour initialiser les champs de la classe abstraite. Vous devez fournir un constructeur pour une classe abstraite si vous souhaitez initialiser certains champs de la classe abstraite avant que l'instanciation d'une classe enfant ait lieu. Un constructeur de classe abstrait peut également être utilisé pour exécuter du code qui est pertinent pour chaque classe enfant. Cela empêche la duplication de code.

Nous ne pouvons pas créer une instance d'une classe abstraite, mais nous pouvons créer des instances de classes dérivées de la classe abstraite. Ainsi, lorsqu'une instance de classe dérivée est créée, le constructeur de la classe abstraite parent est automatiquement appelé.

Référence :Cet article


3
2018-05-20 04:33



Dans une classe concrète, la déclaration d'un constructeur pour un type concret Fnord expose effectivement deux choses:

  • Un moyen par lequel le code peut demander la création d'une instance de Fnord

  • Un moyen par lequel une instance d'un type dérivé de Fnord qui est en construction peut demander que toutes les fonctionnalités de classe de base soient initialisées.

Alors qu'il devrait peut-être y avoir un moyen par lequel ces deux capacités pourraient être contrôlées séparément, pour chaque type concret, une définition permettra les deux. Bien que la première capacité ne soit pas significative pour une classe abstraite, la deuxième capacité est tout aussi significative pour une classe abstraite qu'elle le serait pour n'importe quelle autre, et donc sa déclaration est tout aussi nécessaire et utile.


2
2017-12-06 00:21