Java Language Constructeur d'objet


Exemple

Tous les constructeurs de Java doivent appeler le constructeur Object . Ceci est fait avec l'appel super() . Ce doit être la première ligne d'un constructeur. La raison en est que l'objet peut réellement être créé sur le segment de mémoire avant toute initialisation supplémentaire.

Si vous ne spécifiez pas l'appel à super() dans un constructeur, le compilateur le mettra pour vous.

Donc, ces trois exemples sont fonctionnellement identiques

avec appel explicite au constructeur super()

public class MyClass {

    public MyClass() {
        super();
    }
}

avec appel implicite au constructeur super()

public class MyClass {

    public MyClass() {
        // empty
    }
}

avec constructeur implicite

public class MyClass {

}

Qu'en est-il du constructeur-chaînage?

Il est possible d'appeler d'autres constructeurs comme première instruction d'un constructeur. Comme l'appel explicite à un super constructeur et l'appel à un autre constructeur doivent être les deux premières instructions, elles s'excluent mutuellement.

public class MyClass {

    public MyClass(int size) {

        doSomethingWith(size);

    }

    public MyClass(Collection<?> initialValues) {

        this(initialValues.size());
        addInitialValues(initialValues);
    }
}

L'appel de nouveau MyClass(Arrays.asList("a", "b", "c")) appellera le second constructeur avec l'argument List, qui à son tour déléguera au premier constructeur (qui déléguera implicitement à super() ), puis appelez addInitialValues(int size) avec la deuxième taille de la liste. Ceci permet de réduire la duplication de code lorsque plusieurs constructeurs doivent effectuer le même travail.

Comment appeler un constructeur spécifique?

Compte tenu de l'exemple ci-dessus, on peut appeler new MyClass("argument") ou new MyClass("argument", 0) . En d'autres termes, tout comme la surcharge de méthodes , il vous suffit d'appeler le constructeur avec les paramètres nécessaires au constructeur choisi.

Que se passera-t-il dans le constructeur de la classe Object?

Rien de plus que cela n'arriverait dans une sous-classe qui a un constructeur vide par défaut (moins l'appel à super() ).

Le constructeur vide par défaut peut être explicitement défini, mais sinon le compilateur le mettra pour vous tant qu'aucun autre constructeur n'est déjà défini.

Comment un objet est-il alors créé à partir du constructeur dans Object?

La création réelle des objets incombe à la machine virtuelle Java. Chaque constructeur en Java apparaît comme une méthode spéciale nommée <init> qui est responsable de l'initialisation de l'instance. Cette méthode <init> est fournie par le compilateur et comme <init> n'est pas un identifiant valide en Java, il ne peut pas être utilisé directement dans le langage.

Comment la JVM appelle-t-elle cette méthode <init> ?

La JVM invokespecial la méthode <init> à l'aide de l'instruction invokespecial et ne peut être invoquée que sur des instances de classe non initialisées.

Pour plus d'informations, consultez la spécification JVM et la spécification du langage Java: