À partir de See Java Static Variable Methods :
- C'est une variable qui appartient à la classe et non à l'objet (instance)
- Les variables statiques ne sont initialisées qu'une seule fois, au début de l'exécution. Ces variables seront initialisées en premier, avant l'initialisation de toute variable d'instance
- Une seule copie à partager par toutes les instances de la classe
- Une variable statique est accessible directement par le nom de la classe et n'a besoin d'aucun objet.
Les variables d'instance et de classe (statiques) sont automatiquement initialisées aux valeurs standard par défaut si vous ne parvenez pas à les initialiser volontairement. Bien que les variables locales ne soient pas automatiquement initialisées, vous ne pouvez pas compiler un programme qui ne parvient pas à initialiser une variable locale ou à affecter une valeur à cette variable locale avant son utilisation.
Ce que fait réellement le compilateur est de produire en interne une seule routine d'initialisation de classe qui combine tous les initialiseurs de variables statiques et tous les blocs de code d'initialisation statiques, dans l'ordre dans lequel ils apparaissent dans la déclaration de classe. Cette procédure d'initialisation unique est exécutée automatiquement, une seule fois, lors du premier chargement de la classe.
En cas de intérieur classes , elles ne peuvent pas avoir de champs statiques
Une classe interne est une classe imbriquée qui n'est pas explicitement ou implicitement déclaréestatic
.
...
Les classes internes ne peuvent pas déclarer d'initialiseurs statiques (§8.7) ou d'interfaces membres ...
Les classes internes ne peuvent pas déclarer de membres statiques, sauf si ce sont des variables constantes ...
Voir JLS 8.1.3 Classes internes et instances englobantes
final
les champs en Java peuvent être initialisés séparément de leur lieu de déclaration, mais cela ne peut pas s'appliquer aux static final
champs. Voir l'exemple ci-dessous.
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
En effet, il n'y a qu'une seule copie des static
variables associées au type, plutôt qu'une copie associée à chaque instance du type comme avec les variables d'instance et si nous essayons d'initialiser le z
type static final
dans le constructeur, il tentera de réinitialiser le static final
champ de type z
car le constructeur est exécuté à chaque instanciation de la classe qui ne doit pas se produire dans les final
champs statiques .