web-dev-qa-db-fra.com

Appel d'une Java sans nom

Je regarde le code ci-dessous et j'ai trouvé quelque chose d'un peu étrange:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y ");
    }

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

    static {
        System.out.print("x ");
    }
}

Je m'attendais à ce que cela donne une erreur de compilation comme System.out avec "y" n'appartient pas à une déclaration de méthode juste un { }. Pourquoi est-ce valable? Je ne vois pas comment ce code serait ou devrait être appelé.

Lors de son exécution, il produit x y c g aussi, pourquoi le static { } être appelé avant le constructeur de séquence?

99
david99world

Cette:

static {
        System.out.print("x ");
    }

est un bloc d'initialisation statique , et est appelé lorsque la classe est chargée. Vous pouvez en avoir autant dans votre classe que vous le souhaitez, et ils seront exécutés par ordre d'apparition (de haut en bas).

Cette:

    {
        System.out.print("y ");
    }

est un bloc d'initialisation , et le code est copié au début de chaque constructeur de la classe. Donc, si vous avez de nombreux constructeurs de votre classe, et qu'ils ont tous besoin de faire quelque chose de commun au début, vous n'avez qu'à écrire le code une fois et le mettre dans un bloc d'initialisation comme ça.

Par conséquent, votre sortie est parfaitement logique.

Comme Stanley commenté ci-dessous, voir la section du tutoriel Oracle décrivant les blocs d'initialisation pour plus d'informations.

147
jlordo

Ce n'est pas une méthode mais un bloc d'initialisation .

 {
    System.out.print("y ");
 }

Il sera exécuté avant l'appel du constructeur. Tandis que

static {
        System.out.print("x ");
       }

est le bloc d'initialisation statique qui est exécuté lorsque la classe est chargée par le chargeur de classe.

Ainsi, lorsque vous exécutez votre code
1. La classe est chargée par le chargeur de classe, donc le bloc d'initialisation statique est exécuté
Sortie: x est imprimé
2. L'objet est créé de sorte que le bloc d'initialisation est exécuté, puis le constructeur est appelé
Sortie: y est imprimé suivi de c
3. La méthode principale est invoquée, qui à son tour invoque la méthode go
Sortie: g est imprimé

Sortie finale: x y c g
Cela pourrait aider http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-Java/

25
xyz

C'est un bloc d'initialisation d'instance suivi d'un bloc d'initialisation statique.

{
    System.out.print("y ");
}

est appelé lorsque vous créez une instance de la classe.

static {
    System.out.print("x ");
}

est appelé lorsque la classe est chargée par le chargeur de classe. Alors quand tu fais

new Sequence().go();

la classe est chargée, donc elle exécute static {}, puis il exécute le bloc d'initialisation d'instance {}, le corps du constructeur est ensuite appelé, puis la méthode sur l'instance nouvellement créée. Supprimer la sortie x y c g.

16
Luchian Grigore
static {
        System.out.print("x ");
    }

Est un bloc statique et est appelé pendant le chargement de classe

{
    System.out.print("y ");
}

Est un bloc d'initialisation

Vous pouvez avoir plusieurs blocs d'initialisation dans une classe, auquel cas ils s'exécutent dans l'ordre dans lequel ils apparaissent dans la classe.

Notez que tout bloc d'initialisation présent dans la classe est exécuté avant le constructeur.

15
Narendra Pathai
static {
      System.out.print("x ");
}

est un bloc d'initialisation partagé par la classe (comme indiqué par static), qui est exécuté en premier.

{
        System.out.print("y ");

}

est un bloc d'initialisation partagé par tous les objets (constructeurs) de la classe, qui vient ensuite.

Sequence() {
        System.out.print("c ");
}

est un constructeur particulier pour la classe, qui est exécuté en troisième. Le bloc d'initialisation d'instance est appelé en premier à chaque exécution du constructeur. C'est pourquoi "y" vient juste avant "c".

void go() {
        System.out.print("g ");
}

est juste une méthode d'instance associée à des objets construits à l'aide du constructeur ci-dessus, qui vient en dernier.

10
Terry Li
{
    System.out.print("y ");
}

Ces types de blocs sont appelés initializer block. Il est exécuté à chaque fois que vous créez une instance d'un class. Au moment de la compilation, ce code est déplacé dans chaque constructeur de votre classe.

Où, comme dans le cas de static initializer bloc: -

static {
    System.out.println("x ");
}

il est exécuté une fois lorsque la classe est chargée. Nous utilisons généralement le bloc d'initialisation static lorsque l'initialisation d'un champ static nécessite plusieurs étapes.

9
Rohit Jain

Il est utilisé comme bloc d'initialisation et s'exécute après n'importe quel déclaration statique. Il pourrait être utilisé pour s'assurer que personne d'autre ne peut créer une instance de la classe (de la même manière que vous utiliseriez un constructeur privé) comme avec le modèle de conception Singleton.

6
maloney
static {
    System.out.print("x ");
}

Static blocks n'est exécuté qu'une seule fois lorsque la classe est chargée et initialisée par le JRE.

Et non-static le bloc sera appelé chaque fois que vous créez une nouvelle instance et il sera appelé juste avant le constructeur.

Comme ici, vous n'avez créé qu'une seule instance de Sequence donc construit a été appelé après non-static bloque, puis la méthode qui fait votre objectif.

3