381 votes

Initialiseur static en Java

Ma question est sur l'un particulier de l'utilisation du mot-clé static. Il est possible d'utiliser static mot-clé pour couvrir un bloc de code au sein d'une classe qui n'appartient à aucune fonction. Pour l'exemple de code suivant compile:

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

Si vous supprimez l' static mot-clé, il se plaint parce que la variable a est final. Toutefois, il est possible de supprimer les deux final et static mots-clés et de faire de la compilation.

Il est source de confusion pour moi dans les deux sens. Comment suis-je censé avoir une section de code qui n'appartient pas à n'importe quelle méthode? Comment est-il possible de l'invoquer? En général, quel est le but de cette utilisation? Ou mieux, où puis-je trouver de la documentation à ce sujet?

427voto

Lawrence Dol Points 27976

Le bloc de code avec le modificateur static signifie une classe d'initialiseur; sans le modificateur static le bloc de code est un exemple de l'initialiseur.

Les initialiseurs statiques sont exécutées dans l'ordre où elles sont définies (de haut en bas, comme simple variable d'initialiseurs) lorsque la classe est chargée (en fait, quand c'est résolu, mais c'est un détail technique).

Exemple initialiseurs sont exécutées dans l'ordre défini lors de la classe est instanciée, immédiatement avant que le constructeur code est exécuté immédiatement après l'invocation de la super constructeur.

Si vous supprimez static de int a, il devient une variable d'instance qui n'est pas initialisé lors de la construction. Si vous aussi vous retirez static de l'initialiseur de bloc, il devient alors une instance d'initialiseur et donc, int a est initialisé lors de la construction.

62voto

Alnitak Points 143355

Le `` bloc est un initialiseur « statique ».

Elle est automatiquement appelée lorsque la classe est chargée, et il n’y a pas d’autre moyen pour l’invoquer (sauf peut-être par réflexion ?).

Je l’ai personnellement jamais utilisé lors de l’écriture de code JNI :

15voto

DJClayworth Points 11288

« finale » garantit qu’une variable doit être initialisée avant la fin du code initialiseur d’objet. Même « final statique » garantit qu’une variable sera initialisée à la fin du code d’initialisation de classe. En omettant le « statique » à partir de votre code d’initialisation se transforme en code d’initialisation d’objet ; ainsi votre variable ne remplit plus ses garanties.

11voto

Vincent Ramdhanie Points 46265

Vous n'aurez pas d'écrire du code dans un bloc statique qui doit être invoquée n'importe où dans votre programme. Si le but du code est d'être invoquée, alors vous devez le placer dans une méthode.

Vous pouvez écrire initialiseur statique blocs pour initialiser des variables statiques, lorsque la classe est chargée, mais ce code peut être plus complexe..

Un initialiseur statique bloc ressemble à une méthode ayant pas de nom, pas d'arguments, et pas de type de retour. Puisque vous ne jamais l'appeler, il n'a pas besoin d'un nom. Le seul moment où son nom est lorsque la machine virtuelle charges de la classe.

5voto

Paul Tomblin Points 83687

Le bloc de code statique permet d’instancier ou initialiser des variables de classe (par opposition à des variables de l’objet). Donc déclarer « un » moyen statique qui n’est qu’une partagée par tous les objets de Test, et le bloc de code statique Initialise « a » une seule fois, lorsque la classe de Test is first loaded, peu importe le nombre d’objets Test est créé.

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