12 votes

Clarification des bases de Java - Constructeurs et "statique" ?

class test
{
    test() {
        System.out.println("Constructor");
    }

    { System.out.println("Hai"); }
}

public class sample
{
    public static void main(String [] a) {
        test t = new test();        
    }
}

Dans le code ci-dessus, pourquoi "Hai" est-il imprimé ? avant le constructeur test() est appelé ?

Le constructeur test() de la classe test se trouve au-dessus de l'instruction "Hai" et doit être appelé en premier, n'est-ce pas ?

7voto

Bombe Points 34185

Oui, c'est un initialisateur d'instance . Il est exécuté dès que la classe est instanciée.

3voto

Pascal Thivent Points 295221

Dans le code ci-dessus, pourquoi la déclaration entre accolades ("Hai") est-elle imprimée avant l'exécution du constructeur ?

Parce que c'est le comportement attendu, tel que décrit dans la section 12.5 Création de nouvelles instances de classe de la Spécification du langage Java :)

Juste avant un renvoi ne soit renvoyée en tant qu'objet le constructeur indiqué est pour initialiser le nouvel objet à l'aide de la procédure suivante :

  1. Affecter les arguments du constructeur à ne nouvellement créées pour cette invocation invocation.
  2. Si ce constructeur commence par une co d'un autre constructeur de la même classe (en utilisant this ), puis évaluer la arguments et traiter l'invocation du constructeur de manière récursive en utilisant les mêmes cinq étapes. Si ce constructeur se termine brusquement, alors cette procédure se termine brusquement pour pour la même raison ; sinon, continuez avec l'étape 5.
  3. Ce constructeur ne commence pas par un constructeur explicite l'invocation d'un autre constructeur dans la même classe (en utilisant this ). Si cette est pour une classe autre que Object alors ce constructeur b d'un constructeur de superclasse (en utilisant super ). Évaluer l argum de manière récursive en suivant les cinq mêmes étapes. Si cette l'invocation du constructeur se termine brusquement, alors cette procédure se termine brusquement pour la même raison. Sinon, continuer avec l'étape 4.
  4. Exécuter les initialisateurs d'instance et les initialisateurs de variables d'instance pour cette classe en attribuant la valeur aux valeurs des initialisateurs des variables d'instance variables d'instance correspondantes, dans l'ordre de gauche à droite dans lequel elles apparaissent textuellement dans le code source de la classe. Si l'exécution de l'un de ces ces initialisateurs entraîne une une exception, aucun autre n'est traité et cette se termine brusquement par cette même exception. Dans le cas contraire, il faut continuer à l'étape 5. à l'étape 5. (Dans certaines le compilateur incorr initialiser un champ si l'expression de l'initialisateur du champ [ ] dont la valeur était égale à la valeur d'initialisation par défaut pour son type).
  5. Exécuter le reste du corps de ce constructeur. I se termine brusquement, alors cette procédure se termine brusquement pour la même raison. Sinon, cette procédure s'achève normalement.

Voir section 8.6 Initialisateurs d'instances pour plus de détails sur les initialisateurs d'instances.

2voto

Les accolades immédiatement à l'intérieur d'une classe introduisent un initialisateur d'instance (introduit en Java 1.1). Elles sont traitées de la même manière que le code d'affectation des champs écrit dans le cadre de la déclaration. Les exemples suivants sont donc équivalents :

 private final Thing x = new Thing();

et

 private final Thing x;
 {
     x = new Thing();
 }

Le code est exécuté par les constructeurs immédiatement après l'appel à un super constructeur. Ainsi, en supposant qu'il n'y ait pas d'autre initialisation, le code peut être écrit de manière équivalente en tant que partie du constructeur :

 private final Thing x;
 public MyCLass() {
     super(); // Often implicit.
     x = new Thing();
 }

Les accolades dans la même position précédées par le symbole static et les initialisateurs statiques, exécutés une seule fois lors de l'initialisation d'une classe, et non pas pour chaque instance.

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