ClassA() {}
:class ClassA { }La classe ClassB n'aura pas de constructeur sans paramètres:
class ClassB { ClassB(int arg1) { } }Important : les constructeurs ne sont pas héritables ; une sous-classe n'hérite pas les constructeurs de ses superclasses et par conséquent les concepts d'héritage et de redéfinition ne s'appliquent pas aux constructeurs.
void
.public
, protected
, private
, ou l'accès par défaut.final
, static
, ...public class ClassD { final ClassD() { } // compiler error: Illegal modifier for the constructor in type ClassD; only public, protected & private are permitted }
class ClassC { // Une déclaration légale d'un constructeur ClassC() { } // Le compilateur s'attend à une déclaration de méthode et non à un constructeur classc() { } // compiler error: Return type for the method is missing // Une déclaration légale d'une méthode void clASSc() { } }Il est possible de déclarer une méthode qui a exactement le même nom que celui de la classe ; la différence entre une méthode et un constructeur est :
new
(instanciation).class ClassC { ClassC() { } ClassC(int arg1) { } ClassC(int arg1, boolean arg2) { } }
super()
).this
) à un autre constructeur de la même classe ;super
) à un constructeur de la superclasse.class SuperClass { SuperClass() { // le compilateur ajoute l'instruction suivante : super(); System.out.println(); } } class SubClass extends SuperClass { SubClass() { // le compilateur ajoute l'instruction suivante : super(); } SubClass(boolean arg1) { this(); // À cause de l'appel this, le compilateur n'ajoute pas un appel au constructeur sans paramètres de la superclasse } SubClass(int arg1) { super(); // À cause de l'appel super, le compilateur n'ajoute pas un appel au constructeur sans paramètres de la superclasse } }
class SuperClass1 { SuperClass1() { } } class SuperClass2 extends SuperClass1 { SuperClass2(int arg1) { // OK la superclasse SuperClass1 déclare un constructeur sans paramètres } } class SubClass extends SuperClass2 { SubClass() { } // compiler error: Implicit super constructor SuperClass2() is undefined. Must explicitly invoke another constructor SubClass(boolean arg1) { this(); // OK : à cause de l'appel this, le compilateur n'ajoute pas un appel au constructeur sans paramètres de la superclasse } SubClass(int arg1) { super(arg1); // OK : à cause de l'appel super, le compilateur n'ajoute pas un appel au constructeur sans paramètres de la superclasse } }Pour comprendre l'erreur, voici le code du constructeur comme il est vu par le compilateur :
class SubClass extends SuperClass2 { SubClass() { super(); // compiler error: The constructor SuperClass2() is undefined } SubClass(boolean arg1) { this(); } SubClass(int arg1) { super(arg1); } }
this
et super
sont utilisés dans le code du constructeur,
il faut qu'ils soient les premières instructions du code,
sinon le compilateur générera une erreur.class SuperClass2 { SuperClass2() { } } class SubClassF extends SuperClass2 { SubClassF() { System.out.println(); super(); // compiler error: Constructor call must be the first statement in a constructor } SubClassF(boolean arg1) { System.out.println(); this(); // compiler error: Constructor call must be the first statement in a constructor } }
class ClassG { ClassG() { this(true); // compiler error: Recursive constructor invocation ClassG(boolean) } ClassG(boolean arg1) { this(); // compiler error: Recursive constructor invocation ClassG() } }
this();
ou super();
.this();
ou super();
.class SuperClass { SuperClass() { } SuperClass(int arg1) { } } class SubClass extends SuperClass { int var1 = 1; static int var2 = 1; SubClass() { this(var1); // compiler error: Cannot refer to an instance field var1 while explicitly invoking a constructor } SubClass(int arg1) { super(var1); // compiler error: Cannot refer to an instance field var1 while explicitly invoking a constructor } SubClass(short arg1) { super(arg1); // OK } SubClass(float arg1) { this(instanceMethod()); // compiler error: Cannot refer to an instance method while explicitly invoking a constructor } SubClass(double arg1) { this(staticMethod()); // OK } SubClass(int arg1, int arg2) { this(staticMethod() + arg1 + arg2 + var2); // OK var1 = instanceMethod(); // OK var2 = staticMethod(); // OK } public Integer instanceMethod() { return 0; } public static Integer staticMethod() { return 0; } }
new
.new
décident quel constructeur sera exécuté.class ClassH { ClassH() { } ClassH(int arg1) { } } public class Test1 { public static void main(String[] args) { new ClassH(); // ClassH() sera exécuté new ClassH(1); // ClassH(int arg1) sera exécuté } }
new
peut invoquer un autre constructeur de la même classe en utilisant le mot clé this
.
L'autre constructeur peut à son tour utiliser this
pour invoquer un autre constructeur, et ainsi de suite.
Voir ci-dessus les détails sur les appels récursifs des constructeurs.this
décident quel constructeur sera exécuté.this
(comme c'est le cas avec super
) doit être la première ligne du code du constructeur (voir détail ci-dessus).class ClassI { ClassI() { this(1); } // invocation du constructeur ClassI(int arg1) ClassI(int arg1) { } } public class Test1 { public static void main(String[] args) { new ClassI(); // ClassI() sera exécuté new ClassI(1); // ClassI(int arg1) sera exécuté } }
new
peut invoquer un autre constructeur de la superclasse en utilisant le mot clé super
.
Le constructeur de la superclasse peut à son tour utiliser le mot clé super
pour invoquer un constructeur de sa superclasse, et ainsi de suite.super
décident quel constructeur de la superclasse sera exécuté.super();
au début du code du constructeur,
si celui ci ne contient pas un appel explicite au mot clé this ou super.class SuperClass { SuperClass() { } // le compilateur ajoutera l'instruction "super();" au début du code SuperClass(int arg1) { } // le compilateur ajoutera l'instruction "super();" au début du code } class SubClass extends SuperClass { SubClass() { } // le compilateur ajoutera l'instruction "super();" au début du code SubClass(int arg1) { super(arg1); } // le constructeur de la superclasse "SuperClass(int arg1)" sera exécuté }