723 votes

Une classe abstraite peut-il provoquer un constructeur ?

Une classe abstraite peut-il provoquer un constructeur ?

Dans l’affirmative, comment il peut être utilisé et à quelles fins ?

741voto

Michael Rutherfurd Points 4029

Réfléchissez à ceci:

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

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

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

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

La super-classe de Produit est abstraite et a un constructeur. La classe de béton TimesTwo a un constructeur par défaut qui vient de code en dur la valeur 2. La classe de béton TimesWhat a un constructeur qui permet à l'appelant de spécifier la valeur.

REMARQUE: Comme il n'y a pas de valeur par défaut (ou de non-arg) constructeur dans le parent de la classe abstraite le constructeur utilisé dans les sous-classes doivent être spécifiés.

Résumé constructeurs vont souvent être utilisée pour appliquer des contraintes de classe ou les invariants tels que les champs minimum pour l'installation de la classe.

184voto

jfpoilpret Points 6523

Vous pourriez définir un constructeur dans une classe abstraite si vous êtes dans l'une de ces situations:

  • vous voulez faire quelque initialisation (pour les champs de la classe abstraite) avant le l'instanciation d'une sous-classe en fait lieu
  • vous avez défini final champs de la classe abstraite mais vous n'avez pas les initialiser dans la déclaration lui-même; dans ce cas, vous DEVEZ avoir un constructeur pour initialiser ces champs

Notez que:

  • vous pouvez définir plus d'un constructeur (avec les différentes les arguments)
  • vous pouvez (devez?) définissez vos les constructeurs protégées (en les rendant le public est inutile de toute façon)
  • votre constructeur de sous-classe(s) peut appeler un constructeur de l'abstrait classe; il peut même avoir à l'appeler (si il n'y a pas de no-arg constructeur dans la classe abstraite)

Dans tous les cas, n'oubliez pas que si vous ne définissez pas un constructeur, alors le compilateur va générer automatiquement un pour vous (ce qui est public, n'a pas d'argument, et ne fait rien).

75voto

Lawrence Dol Points 27976

Oui, il peut avoir un constructeur et elle est définie et se comporte exactement comme constructeur de n’importe quel autre classe. Sauf que les classes abstraites ne peuvent pas être directement instanciées, uniquement étendu, donc l’utilisation est donc toujours de constructeur de sous-classe.

59voto

Aniket Thakur Points 10135

Oui! Les classes abstraites peuvent avoir des constructeurs!

Oui, quand on est de définir une classe à une Classe Abstraite, il ne peut pas être instanciée, mais cela ne signifie pas une classe Abstraite ne peut pas avoir de constructeur. Chaque classe abstraite doit avoir une sous-classe concrète à mettre en œuvre les méthodes abstraites de la classe abstraite.

Lorsque nous créons un objet d'une sous-classe de tous les constructeurs dans l'arbre d'héritage sont invoqués en approche. Même cas s'applique pour les classes abstraites. Si nous ne pouvons pas créer un objet de la classe abstraite, lorsque nous créons un objet d'une classe qui est en béton et sous-classe de la classe abstraite, constructeur de la classe abstraite est automatiquement appelée.Par conséquent, nous pouvons avoir un constructeur dans les classes abstraites.

Remarque : Un non-classe abstraite ne peut pas avoir une des méthodes abstraites, mais une classe abstraite peut avoir une méthode abstraite. La raison est similaire à celle des constructeurs, la différence étant au lieu d'obtenir automatiquement invoqué, nous pouvons faire appel à super(). Aussi il n'y a rien comme abstrait constructeur, car il ne fait aucun sens du tout.

15voto

MattC Points 478

Non seulement il peut, il le fait toujours. Si vous ne spécifiez pas, puis il a un défaut, aucun arg constructeur, comme n'importe quelle autre classe. En fait, TOUTES les classes, y compris imbriquées et anonyme des classes, va avoir un constructeur par défaut si l'on n'est pas spécifié (dans le cas de l'anonymat de classes, il est impossible de spécifier un, de sorte que vous obtenez toujours le constructeur par défaut).

Un bon exemple d'une classe abstraite avoir un constructeur est le Calendrier de la classe. Vous obtenez un Calendrier de l'objet en appelant le Calendrier.getInstance(), mais elle a aussi des constructeurs qui sont protégés. La raison de ses constructeurs sont protégés et ne soient pas privées, est de sorte qu'il peut être étendu par des sous-classes. Parce que les constructeurs sont protégés, seules les classes du même package peut prolonger le Calendrier. Que de 1,7, la sous-classe GregorianCalendar est la seule classe qui peut accéder au Calendrier des constructeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X