1. Méthodes statiques

En plus des variables statiques, les classes peuvent également avoir des méthodes statiques.

Les méthodes régulières sont liées aux objets (instances) d'une classe et peuvent faire référence à des variables ordinaires (non statiques) de la classe (ainsi qu'à des variables et méthodes statiques ). Les méthodes statiques sont liées à l'objet statique de la classe et ne peuvent accéder qu'aux variables statiques et/ou aux autres méthodes statiques de la classe.

Pour appeler une méthode ordinaire (non statique) sur une classe, vous devez d'abord créer un objet de la classe , puis appeler la méthode sur l'objet. Vous ne pouvez pas appeler une méthode ordinaire sur la classe plutôt qu'un objet.

Exemple:

Vous ne pouvez pas appeler une méthode non statique sur une classe !
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Mais pour appeler une méthode statique, il suffit que l'objet statique de la classe existe simplement (et il existe toujours après le chargement de la classe en mémoire). C'est pourquoi la méthode main() est statique. Il est lié à l'objet statique de la classe, vous n'avez donc pas besoin de créer d'objets pour l'appeler.

Pour déclarer une méthode statique, vous devez écrire le mot-clé statique avant l'en-tête de la méthode. L'aspect général de cette construction est le suivant :

static Type name(parameters)
{
   method code
}

Exemples:

Code Note
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


La machine Java appelle la mainméthode avec une commande comme celle-ci : Solution.main();



La méthode statique test()est appelée dans la main()méthode statique.

Pour appeler une méthode statique à partir d'une autre classe, vous devez spécifier le nom de la classe avant le nom de la méthode statique. L'aspect général de cette construction est le suivant :

Type name = ClassName.methodName(arguments)

Exemples:

Code Méthode statique
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Méthodes statiques vs ordinaires (non statiques)

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

Une méthode ordinaire est liée à un objet ordinaire (une instance d'une classe), alors qu'une méthode statique ne l'est pas. Une méthode ordinaire peut accéder aux variables de son instance, mais une méthode statique ne le peut pas : elle n'a tout simplement pas d'instance associée.

Les différences entre les deux types de méthodes sont exprimées dans le tableau suivant :

Capacité/propriété Méthode ordinaire Méthode statique
Lié à une instance de la classe Oui Non
Peut appeler les méthodes ordinaires de la classe Oui Non
Peut appeler des méthodes statiques de la classe Oui Oui
Peut accéder aux variables ordinaires de la classe Oui Non
Peut accéder aux variables statiques de la classe Oui Oui
Peut être appelé sur un objet Oui Oui
Peut être appelé sur la classe Non Oui

Pourquoi de telles méthodes sont-elles nécessaires si elles sont si sévèrement limitées ? La réponse est que cette approche a aussi ses avantages.

Tout d'abord, vous n'avez pas besoin de passer de référence d'objet pour accéder aux méthodes et variables statiques.

Deuxièmement, vous avez parfois besoin qu'il n'y ait qu'une seule instance d'une variable. Par exemple, System.out( la variable de sortie statique de la classe System ).

Et, troisièmement, vous devez parfois appeler une méthode avant même qu'il soit possible de créer des objets. Par exemple, la machine Java appelle la méthode main() pour lancer l'exécution du programme avant même la création d'une instance de la classe.

Lié à une instance de la classe

Lorsqu'une méthode ordinaire est appelée, un argument - l'objet sur lequel la méthode est appelée - lui est implicitement passé. Ce paramètre est appelé this. Ce paramètre implicite (une référence à l'objet sur lequel la méthode est appelée) distingue les méthodes ordinaires des méthodes statiques.

Les méthodes statiques n'ont pas ce paramètre implicite, vous ne pouvez donc pas utiliser le thismot clé à l'intérieur des méthodes statiques et vous ne pouvez pas appeler une méthode non statique à l'intérieur d'une méthode statique. Il n'y a tout simplement nulle part où obtenir une référence à une instance d'une classe.

Peut appeler les méthodes ordinaires de la classe

Une méthode ordinaire a toujours le thisparamètre implicite, donc vous avez toujours une référence à l'objet sur lequel la méthode est appelée. Chaque fois que vous appelez une méthode ordinaire à l'intérieur d'une autre méthode ordinaire, le thisparamètre implicite est utilisé pour effectuer cet appel. Exemple

Code Comment ça fonctionne
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

C'est pourquoi vous ne pouvez pas appeler une méthode ordinaire à partir d'une méthode statique. Il n'y a tout simplement pas de variable implicite nommée thisdans une méthode statique.

Ou imaginez une autre situation : pas un seul objet de notre classe n'a encore été créé dans notre programme. Pouvons-nous appeler une méthode statique de notre classe ? Oui. Et cette méthode statique peut-elle appeler une méthode ordinaire (non statique) ?

Eh bien, sur quel objet l'appellerions-nous? Après tout, pas une seule instance de notre classe n'existe encore !

Peut appeler des méthodes statiques de la classe

Les méthodes statiques peuvent être appelées de n'importe où — de n'importe quel endroit du programme. Cela signifie qu'ils peuvent être appelés à la fois par des méthodes statiques et par des méthodes ordinaires. Il n'y a aucune restriction ici.

Peut accéder aux variables ordinaires de la classe

Vous pouvez accéder aux variables ordinaires d'une classe à partir d'une méthode ordinaire, car elle peut facilement obtenir une référence à une instance de la classe via le thisparamètre implicite.

Une méthode statique ne sait pas quelle instance de la classe elle doit utiliser pour obtenir les valeurs des variables ordinaires. Et plus généralement, nous pouvons facilement avoir une situation où une méthode statique est appelée mais pas une seule instance de la classe n'a encore été créée dans le programme.

Par conséquent, les méthodes statiques ne peuvent pas accéder aux variables ordinaires d'une classe.

Supposons qu'une méthode statique appelle une méthode ordinaire. Sur quel objet cette méthode ordinaire doit-elle être appelée ?

Méthodes statiques

Personne ne sait! C'est pourquoi vous ne pouvez pas appeler une méthode ordinaire à partir d'une méthode statique sans passer une référence à un objet !

Peut accéder aux variables statiques de la classe

La situation avec les appels aux variables statiques est la même qu'avec les appels aux méthodes statiques. Les variables statiques sont accessibles de n'importe où dans le programme. Cela signifie que vous pouvez y accéder à partir de méthodes statiques et ordinaires.

Peut être appelé sur un objet

Les méthodes statiques et ordinaires peuvent être appelées sur un objet. Un appel de méthode ordinaire possible — en effet, c'est la seule façon d'appeler une méthode ordinaire. Une méthode statique peut également être appelée sur un objet : dans ce cas, le compilateur détermine lui-même le type de la variable et appelle la méthode statique en fonction de son type :

Code Comment le compilateur le voit
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Peut être appelé sur la classe

Vous ne pouvez appeler qu'une méthode statique sur une classe. Pour appeler une méthode ordinaire, vous avez besoin d'une référence à une instance de la classe. Par conséquent, vous ne pouvez pas appeler une méthode ordinaire à l'aide de cette construction :ClassName.methodName(arguments)