La raison pour laquelle le code ne se compile pas initialement est la suivante defaultValue
est un variable d'instance de la classe Test
ce qui signifie que lorsqu'un objet de type Test
est créée, une instance unique de defaultValue
est également créé et rattaché à cet objet particulier. Pour cette raison, il n'est pas possible de référencer defaultValue
dans le constructeur, car ni lui ni l'objet n'ont encore été créés.
La solution consiste à rendre la variable finale static
:
public class Test {
private static final int defaultValue = 10;
private int var;
public Test() {
this(defaultValue);
}
public Test(int i) {
var = i;
}
}
En rendant la variable static
il devient associé à la classe elle-même, plutôt qu'aux instances de cette classe, et il est partagé par toutes les instances de Test
. Les variables statiques sont créées lorsque la JVM charge la classe pour la première fois. Comme la classe est déjà chargée lorsque vous l'utilisez pour créer une instance, la variable statique est prête à l'emploi et peut donc être utilisée dans la classe, y compris dans le constructeur.
Références :