109 votes

quand les variables statiques sont initialisées en Java

les variables statiques sont initialisés à des valeurs par défaut. Je me demande quand cela arrive? quand une classe est chargée, statique vars sont créés(espace alloué), puis les initialiseurs statiques et les initialisations dans les déclarations sont exécutées. À ce point, les valeurs par défaut sont donnés? Cela conduit au problème de la référence vers l'avant.

Je suis totalement confus sur ce sujet à champ statique des variables. Aussi s'il vous plaît si vous pouvez expliquer ceci en référence à la question posée sur le Pourquoi de champs statiques ne sont pas initialisées dans le temps? et surtout la réponse donnée par Kevin Brock sur le même site. Je ne peux pas comprendre le 3ème point.

90voto

Lion Points 7328
  • C'est une variable qui appartient à la classe et non pas à l'objet(instance)
  • Les variables statiques sont initialisé qu'une seule fois , au début de l'exécution .
  • Ces variables sont initialisées d'abord, avant l'initialisation de toutes les variables d'instance
  • Un seul exemplaire pour être partagés par toutes les instances de la classe
  • Une variable statique peut être accessible directement par le nom de la classe et n'a pas besoin de n'importe quel objet. Voir

D'Instance et de classe (statiques), les variables sont automatiquement initialisés à des valeurs standard par défaut si vous ne parvenez pas pour dessein de les initialiser. Bien que les variables locales ne sont pas initialisés automatiquement, vous ne pouvez pas compiler un programme qui ne soit initialiser une variable locale ou d'affecter une valeur à cette variable locale avant de l'utiliser.

Ce que le compilateur ne fait est interne à la production d'un seul de la classe de routine d'initialisation qui combine toutes les variables statiques initialiseurs et l'ensemble de l'initialiseur statique des blocs de code, dans l'ordre où ils apparaissent dans la déclaration de classe. Cette simple procédure d'initialisation est exécutée automatiquement, une seule fois, lorsque la classe est chargée pour la première fois.

Dans le cas de la statique à l' intérieur des classes, ils ne peuvent pas avoir de champs statiques

Un intérieur de classe est une classe imbriquée qui n'est pas explicitement ou implicitement déclarée statique. Les classes internes peuvent ne pas déclarer les initialiseurs statiques (§8.7) ou membre interfaces. Les classes internes peuvent ne pas déclarer statique les membres, sauf s'ils sont en constante à la compilation des champs"

Voir JLS 8.1.3 les Classes internes et en Joignant les Instances

final champs en Java peut être initialisé séparément de leur déclaration de lieu, c'est cependant peut-être pas applicable à l' static final champs. Voir l'exemple ci-dessous.

final class Demo
{
    private final int x;
    private static final int z;  //must be initialized here.

    static 
    {
        z = 10;  //It can be initialized here.
    }

    public Demo(int x)
    {
        this.x=x;  //This is possible.
        //z=15; compiler-error - can not assign a value to a final variable z
    }
}

C'est parce qu'il est juste une copie de l' static variables associées avec le type, plutôt que celui qui est associé à chaque instance du type avec les variables d'instance et si l'on essaie d'initialiser z de type static final dans le constructeur, il va tenter de réinitialiser l' static final type de champ z parce que le constructeur est exécuté sur chaque instanciation de la classe qui ne doit pas se produire de la statique final champs.

17voto

Dave Points 3143

Les champs statiques sont initialisés lorsque la classe est chargée par le chargeur de classes. Les valeurs par défaut sont attribuées à ce moment. Ceci est fait dans l'ordre dans lequel ils apparaissent dans le code source.

15voto

Dave Newton Points 93112

Voir:

La dernière prévoit, en particulier détaillée des étapes d'initialisation qui sort lorsque les variables sont initialisées, et dans quel ordre (avec la mise en garde que final variables de classe et d'interface des champs qui sont des constantes de compilation sont initialisés en premier.)

Je ne suis pas sûr de ce que votre question précise sur le point 3 (en supposant que tu veux dire imbriqués l'un?) est. La séquence détaillée etats, ce serait un appel récursif à l'initialisation de la demande de sorte qu'il continuera d'initialisation.

6voto

aleroot Points 30853

variable statique

  • C'est une variable qui appartient à la classe et non pas à l'objet(instance)
  • Les variables statiques sont initialisé qu'une seule fois , au début de l'exécution(lorsque le chargeur de classe de charger la classe pour la première fois) .
  • Ces variables sont initialisées d'abord, avant l'initialisation de toutes les variables d'instance
  • Un seul exemplaire pour être partagés par toutes les instances de la classe
  • Une variable statique peut être accessible directement par le nom de la classe et n'a pas besoin de n'importe quel objet

5voto

RalphChapin Points 1800

En commençant par le code de la question:

class MyClass {
  private static MyClass myClass = new MyClass();
  private static final Object obj = new Object();
  public MyClass() {
    System.out.println(obj); // will print null once
  }
}

Une référence à cette classe va commencer l'initialisation. Tout d'abord, la classe sera marqué comme initialisé. Puis le premier champ statique sera initialisé avec une nouvelle instance de Maclasse(). Notez que maclasse est immédiatement donné une référence à un vide instance de Maclasse. L'espace est là, mais toutes les valeurs sont nulles. Le constructeur est maintenant exécuté et imprime obj, qui est nulle.

Maintenant, revenons à l'initialisation de la classe: obj est fait référence à un nouvel objet réel, et nous avons fini.

Si elle a été définie par une instruction comme: MyClass mc = new MyClass(); de l'espace pour une nouvelle instance de Maclasse est encore alloué (et la référence placée en mc). Le constructeur est de nouveau exécutée et encore imprime obj, ce qui maintenant n'est pas nulle.

Le vrai truc c'est que lorsque vous utilisez new, comme en WhatEverItIs weii = new WhatEverItIs( p1, p2 ); weii est immédiatement donné une référence à un peu de entaché de nullité de la mémoire. La JVM sera pour initialiser des valeurs et exécuter le constructeur. Mais si vous en quelque sorte de référence weii avant qu'il ne sorte--par la référence à partir d'un autre thread ou ou par la référence à partir de la classe d'initialisation, par exemple, vous êtes à la recherche à une instance de classe rempli avec des valeurs null.

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