1. Variables statiques

Lorsqu'une classe est chargée en mémoire, un objet statique est immédiatement créé. Cet objet stocke des variables de classe statiques (champs de classe statiques). L'objet statique existe même si aucun objet ordinaire (non statique) de la classe n'a été créé.

Lorsque nous déclarons des variables dans une classe, nous indiquons si elles seront créées une seule fois ou s'il doit y avoir des instances distinctes de ces variables dans chaque objet. Par défaut, une nouvelle copie de chaque variable est créée pour chaque objet.

Une variable statique est liée à l'objet statique de la classe et il y a toujours une seule instance de celle-ci.

Pour créer une variable statique dans une classe, vous devez écrire le staticmot-clé avant son nom. Le format général pour déclarer une variable statique est :

static Type name = value;

Si une variable statique ne se voit pas attribuer de valeur initiale, elle est initialisée avec une valeur par défaut :

Taper Valeur par défaut
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(la même chose que
0
)
boolean
false
Object
et tous les cours
null

Exemples:

Code Note
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

A l'intérieur d'une classe, vous pouvez faire référence à ses variables statiques simplement en utilisant leurs noms. Mais pour y accéder depuis une autre classe, il faut écrire le nom de la classe avant le nom de la variable statique.

ClassName.variable

Exemple:

Variable Classe Accéder à une variable hors de sa classe
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
La variable est private. Il n'est pas visible à l'extérieur de la classe.
private static int count = 0;
Counter
La variable est private. Il n'est pas visible à l'extérieur de la classe.
private static boolean flag;
Arithmetic
La variable est private. Il n'est pas visible à l'extérieur de la classe.


2. Différence entre les variables statiques et non statiques

Les variables non statiques (ordinaires) d'une classe sont déclarées de la même manière que les variables statiques, mais sans le staticmot-clé.

Quelle est la différence entre les variables ordinaires et les variables statiques ?

Les variables ordinaires d'une classe sont liées aux objets de la classe (instances de la classe), tandis que les variables statiques sont liées à l'objet statique de la classe.

S'il existe plusieurs instances d'une classe, chacune d'elles possède sa propre copie des variables non statiques (ordinaires). Les variables statiques d'une classe sont toujours stockées dans son objet statique et il n'en existe qu'une seule instance.

Vous ne pouvez accéder aux variables ordinaires (champs) d'une classe que si vous avez une référence à un objet de la classe. Et à l'intérieur des méthodes de la classe, bien sûr.

Exemple:

Accéder à un champ d'une classe à l'aide d'une référence d'objet
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

Vous pouvez accéder aux variables statiques de n'importe où (après prise en compte des modificateurs de visibilité) : depuis les méthodes ordinaires, depuis les méthodes statiques de la même classe, depuis les méthodes d'autres classes, etc.

Exemple:

Accéder à un champ statique d'une classe sans utiliser de référence d'objet
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Comment la mémoire est organisée :

Disons que nous avons une Personclasse avec 4 champs : deux sont statiques et deux ne le sont pas.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Immédiatement après le chargement de la classe

Lorsque la machine Java a fini de charger la Personclasse, la mémoire ressemblera à ceci :

Après avoir créé le premier objet

Si nous créons un Personobjet, alors l'image devient ceci :

Différence entre les variables statiques et non statiques 2

Veuillez noter que bien que les deux objets aient deux variables, ce sont des variables différentes : les objets ordinaires ont des variables ordinaires et l'objet statique a les variables statiques.

Nous avons besoin de plus d'objets

Créons deux autres Personobjets. Maintenant, la mémoire ressemblera à ceci :

Différence entre les variables statiques et non statiques 3

Veuillez noter que chaque objet a ses propres variables d'âge et de nom.



3. Supprimer et ajouter le staticmodificateur

Du statique à l'ordinaire

Que se passe-t-il si nous prenons une variable statique et la transformons en une variable ordinaire en supprimant son staticmodificateur ? Par exemple, la static int sumvariable.

Le code modifié ressemblera à ceci :

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Maintenant, la mémoire ressemble à ceci :

Différence entre les variables statiques et non statiques

La variable statique a disparu de l'objet statique, et maintenant chaque objet ordinaire a sa propre sumvariable.

De l'ordinaire au statique

On peut faire l'inverse : ajouter le staticmodificateur aux variables ordinaires d'une classe. Ils disparaîtront de tous les objets ordinaires et apparaîtront dans l'objet statique. Supposons que nous décidions de rendre les variables ageet namestatiques. Ensuite, le code ressemblera à ceci :

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

Et maintenant, la mémoire ressemblera à ceci :

Suppression et ajout du modificateur statique