Méthodes Java

Dans les chapitres précédents, nous avons souvent utiliséSystem.out.println(), alors qu'est-ce que c'est ?

  • println() est une méthode.
  • System est une classe système.
  • out est l'objet de sortie standard.

Cette instruction est utilisée pour appeler la méthode println() dans l'objet de sortie standard out de la classe système System.

Alors, qu'est-ce qu'une méthode ?

Une méthode Java est une collection d'instructions qui, ensemble, accomplissent une fonction.

  • Une méthode est une combinaison ordonnée d'étapes pour résoudre une classe de problèmes.
  • Une méthode est contenue dans une classe ou un objet.
  • Une méthode est créée dans le programme et référencée ailleurs.

Avantages des méthodes

  • 1. Cela rend le programme plus court et plus clair.
  • 2. C'est bénéfique pour la maintenance du programme.
  • 3. Cela peut améliorer l'efficacité du développement de programmes.
  • 4. Cela améliore la réutilisabilité du code.

Règles de nommage des méthodes

  • 1. Le premier mot d'un nom de méthode doit commencer par une lettre minuscule, et les mots suivants doivent commencer par une lettre majuscule, sans utiliser de séparateurs. Par exemple :addPerson。
  • 2. Les traits de soulignement peuvent apparaître dans les noms de méthodes de test JUnit pour séparer les composants logiques du nom. Un modèle typique est :test<MethodUnderTest>_<state>, par exempletestPop_emptyStack。

Définition de méthode

En général, la définition d’une méthode comprend la syntaxe suivante :

modificateur type de valeur de retour nom de méthode(type de paramètre nom de paramètre){... corps de méthode ...returnreturn value;}

Une méthode est composée d’un en-tête de méthode et d’un corps de méthode. Voici toutes les parties d’une méthode :

  • Modificateurs :Les modificateurs sont facultatifs et indiquent au compilateur comment appeler la méthode. Ils définissent le type d’accès de la méthode.
  • Type de valeur de retour :Une méthode peut renvoyer une valeur. returnValueType est le type de données de la valeur renvoyée par la méthode. Certaines méthodes effectuent l’opération requise mais ne renvoient pas de valeur. Dans ce cas, returnValueType est le mot-clévoid。
  • Nom de la méthode :C’est le nom réel de la méthode. Le nom de la méthode et la table des paramètres constituent ensemble la signature de la méthode.
  • Type de paramètre :Les paramètres agissent comme des espaces réservés. Lorsqu’une méthode est appelée, une valeur est transmise au paramètre. Cette valeur est appelée argument réel ou variable. La liste de paramètres désigne les types de paramètres, leur ordre et leur nombre. Les paramètres sont facultatifs ; une méthode peut ne contenir aucun paramètre.
  • Corps de méthode :Le corps de méthode contient des instructions concrètes qui définissent la fonctionnalité de la méthode.

Par exemple :

public static int age(int birthday){...}

Il peut y avoir plusieurs paramètres :

static float interest(float principal, int year){...}

Remarque :Dans certains autres langages, les méthodes sont appelées procédures et fonctions. Une méthode qui renvoie une valeur non-void est appelée une fonction ; une méthode qui renvoie une valeur void est appelée une procédure.

Exemple

La méthode suivante contient 2 paramètres, num1 et num2, et elle renvoie le maximum de ces deux paramètres.

/** Renvoie la plus grande valeur de deux variables entières*/ public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; }

Une façon plus concise de l'écrire (opérateur ternaire) :

public static int max(int num1, int num2) { return num1 > num2 ? num1 : num2; }

Invocation de méthode

Java prend en charge deux façons d'appeler une méthode, selon que la méthode renvoie une valeur ou non.

Lorsqu'un programme appelle une méthode, le contrôle du programme est transféré à la méthode appelée. Le contrôle est renvoyé au programme lorsque la méthode appelée exécute une instruction return ou atteint l'accolade fermante du corps de la méthode.

Lorsqu'une méthode renvoie une valeur, l'appel de méthode est généralement traité comme une valeur. Par exemple :

int larger = max(30, 40);

Si une méthode renvoie void, l'appel de méthode doit être une instruction. Par exemple, la méthode println renvoie void. L'appel suivant est une instruction :

System.out.println("Bienvenue dans l'exemple !");

Exemple

L'exemple suivant montre comment définir une méthode et comment l'appeler :

Code du fichier TestMax.java :

public class TestMax { /** Méthode principale*/ public static void main(String[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( i + "et" + j + "Comparez, la valeur maximale est :" + k); } /** Renvoie la plus grande de deux variables entières*/ public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; } }

L'exemple ci-dessus se compile et s'exécute avec le résultat suivant :

5 和 2 比较,最大值是:5

Ce programme contient une méthode main et une méthode max. La méthode main est appelée par la JVM. À part cela, la méthode main ne diffère pas des autres méthodes.

L'en-tête de la méthode main est fixe, comme indiqué dans l'exemple. Il a les modificateurs public et static, renvoie une valeur void, le nom de la méthode est main, et il prend un paramètre de type String[]. String[] indique que le paramètre est un tableau de chaînes de caractères.


Le mot-clé void

Cette section explique comment déclarer et appeler une méthode void.

L'exemple suivant déclare une méthode nommée printGrade et l'appelle pour afficher le score donné.

Exemple

Code du fichier TestVoidMethod.java :

public class TestVoidMethod { public static void main(String[] args) { printGrade(78.5); } public static void printGrade(double score) { if (score >= 90.0) { System.out.println('A'); } else if (score >= 80.0) { System.out.println('B'); } else if (score >= 70.0) { System.out.println('C'); } else if (score >= 60.0) { System.out.println('D'); } else { System.out.println('F'); } } }

L'exemple ci-dessus se compile et s'exécute avec le résultat suivant :

C

Ici, la méthode printGrade est une méthode de type void ; elle ne renvoie pas de valeur.

Un appel à une méthode void doit être une instruction. Par conséquent, elle est appelée en tant qu'instruction à la troisième ligne de la méthode main, comme toute instruction se terminant par un point-virgule.


Passage de paramètres par valeur

Lors de l'appel d'une méthode, vous devez fournir des arguments. Vous devez les fournir dans l'ordre spécifié par la liste de paramètres.

Par exemple, la méthode suivante affiche un message n fois de suite :

Code du fichier TestVoidMethod.java :

public static void nPrintln(String message, int n) { for (int i = 0; i < n; i++) { System.out.println(message); } }

Exemple

L'exemple suivant montre l'effet du passage par valeur.

Le programme crée une méthode qui échange deux variables.

Code du fichier TestPassByValue.java :

public class TestPassByValue { public static void main(String[] args) { int num1 = 1; int num2 = 2; System.out.println("Avant l'échange, la valeur de num1 est :" + num1 + ", et la valeur de num2 est :" + num2); //Appel de la méthode swap swap(num1, num2); System.out.println("Après l'échange, la valeur de num1 est :" + num1 + ", et la valeur de num2 est :" + num2); } /** Méthode pour échanger deux variables*/ public static void swap(int n1, int n2) { System.out.println("\tEntrée dans la méthode swap"); System.out.println("\t\tAvant l'échange, la valeur de n1 est :" + n1 + ", la valeur de n2 :" + n2); //Échange des valeurs de n1 et n2 int temp = n1; n1 = n2; n2 = temp; System.out.println("\t\tAprès l’échange, la valeur de n1 est" + n1 + ", la valeur de n2 :" + n2); } }

L'exemple ci-dessus se compile et s'exécute avec le résultat suivant :

交换前 num1 的值为:1 ,num2 的值为:2
    进入 swap 方法
        交换前 n1 的值为:1,n2 的值:2
        交换后 n1 的值为 2,n2 的值:1
交换后 num1 的值为:1 ,num2 的值为:2

Passez deux arguments pour appeler la méthode swap. Il est intéressant de noter qu’après l’appel de la méthode, les valeurs des arguments réels ne changent pas.


Surcharge de méthode

La méthode max utilisée ci-dessus ne fonctionne qu’avec des données de type int. Mais que faire si vous voulez obtenir le maximum de deux données de type à virgule flottante ?

La solution consiste à créer une autre méthode portant le même nom mais avec des paramètres différents, comme indiqué dans le code suivant :

public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; }

Si vous passez des paramètres de type int lors de l’appel de la méthode max, la méthode max avec des paramètres de type int sera appelée ;

Si des paramètres de type double sont passés, le corps de la méthode max avec le type double sera appelé. C’est ce qu’on appelle la surcharge de méthode ;

C'est-à-dire que deux méthodes d'une classe ont le même nom mais des listes de paramètres différentes.

Le compilateur Java détermine quelle méthode doit être appelée en fonction de la signature de la méthode.

La surcharge de méthodes peut rendre les programmes plus clairs et plus lisibles. Les méthodes qui effectuent des tâches étroitement liées doivent utiliser le même nom.

Les méthodes surchargées doivent avoir des listes de paramètres différentes. Vous ne pouvez pas surcharger des méthodes en vous fondant uniquement sur des différences de modificateurs ou de types de retour.


Portée des variables

La portée d'une variable est la partie du programme où la variable peut être référencée.

Les variables définies à l'intérieur d'une méthode sont appelées variables locales.

La portée d'une variable locale commence à partir de sa déclaration et se poursuit jusqu'à la fin du bloc qui la contient.

Les variables locales doivent être déclarées avant de pouvoir être utilisées.

La portée des paramètres d'une méthode couvre toute la méthode. Les paramètres sont en fait des variables locales.

Les variables déclarées dans la partie d'initialisation d'une boucle for ont une portée qui s'étend sur toute la boucle.

Toutefois, les variables déclarées dans le corps de la boucle ont une portée allant de leur déclaration à la fin du corps de la boucle. Il contient des déclarations de variables comme indiqué ci-dessous :

Vous pouvez déclarer une variable locale portant le même nom plusieurs fois dans différents blocs non imbriqués d'une méthode, mais vous ne pouvez pas déclarer une variable locale deux fois dans des blocs imbriqués.

Utilisation des arguments de ligne de commande

Parfois, vous souhaitez transmettre des messages à un programme lorsque vous l'exécutez. Cela est réalisé en passant des arguments de ligne de commande à la fonction main().

Les arguments de ligne de commande sont les informations qui suivent le nom du programme lorsque celui-ci est exécuté.

Exemple

Le programme suivant affiche tous les arguments de ligne de commande :

Code du fichier CommandLine.java :

public class CommandLine { public static void main(String[] args){ for(int i=0; i<args.length; i++){ System.out.println("args[" + i + "]: " + args[i]); } } }

Exécutez ce programme comme suit :

$ javac CommandLine.java 
$ java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

Méthodes de constructeur

Un constructeur est une méthode spéciale utilisée pour créer des objets d'une classe. Lorsqu'un objet est créé à l'aide du mot-clé new, le constructeur est automatiquement appelé pour initialiser les propriétés de l'objet.

Caractéristiques des constructeurs :

  • Le nom de la méthode est identique au nom de la classe: Le nom du constructeur doit correspondre au nom de la classe.
  • Aucun type de retour: Les constructeurs n'ont pas de type de retour ; mêmevoidvoid ne peut pas être écrit.
  • Appelé automatiquement lors de la création d'un objet: Chaque fois que vous utiliseznewnew pour créer un objet, le constructeur est automatiquement appelé.
  • Peut être surchargé: Vous pouvez définir plusieurs constructeurs pour la même classe, mais les listes de paramètres de ces constructeurs doivent être différentes (c'est-à-dire qu'elles constituent une surcharge).

Que vous définissiez ou non un constructeur personnalisé, toutes les classes ont des constructeurs, car Java fournit automatiquement un constructeur par défaut. Le modificateur d'accès du constructeur par défaut est le même que celui de la classe (si la classe est public, le constructeur est également public ; si la classe est changée en protected, le constructeur est également changé en protected).

Une fois que vous définissez votre propre constructeur, le constructeur par défaut devient invalide.

Exemple

Voici un exemple d'utilisation d'un constructeur :

//Un constructeur simple class MyClass { int x; //Voici le constructeur MyClass(int i ) { x = i; } }

Vous pouvez appeler le constructeur pour initialiser un objet comme ceci :

Code du fichier ConsDemo.java :

public class ConsDemo { public static void main(String[] args) { MyClass t1 = new MyClass( 10 ); MyClass t2 = new MyClass( 20 ); System.out.println(t1.x + " " + t2.x); } }

Le résultat d'exécution est le suivant :

10 20

Pour plus de contenu, reportez-vous au chapitre suivant :Constructeurs Java。

Arguments variables

À partir du JDK 1.5, Java prend en charge le passage d'arguments variables de même type à une méthode.

La déclaration des arguments variables d'une méthode est la suivante :

typeName... parameterName

Dans la déclaration de la méthode, ajoutez des points de suspension (...) après le type de paramètre spécifié.

Une méthode ne peut spécifier qu'un seul argument variable, et il doit être le dernier paramètre de la méthode. Tout paramètre ordinaire doit être déclaré avant celui-ci.

Exemple

Code du fichier VarargsDemo.java :

public class VarargsDemo { public static void main(String[] args) { //Appel d'une méthode avec un nombre variable d'arguments printMax(34, 3, 3, 2, 56.5); printMax(new double[]{1, 2, 3}); } public static void printMax( double... numbers) { if (numbers.length == 0) { System.out.println("Aucun argument passé"); return; } double result = numbers[0]; for (int i = 1; i < numbers.length; i++){ if (numbers[i] > result) { result = numbers[i]; } } System.out.println("La valeur maximale est " + result); } }

L'exemple ci-dessus se compile et s'exécute avec le résultat suivant :

The max value is 56.5
The max value is 3.0

La méthode finalize()

La méthode finalize a été dépréciée dans Java 9 et sera supprimée dans les futures versions de Java. Il est recommandé d'utiliser try-with-resourcestry-with-resourcesoujava.lang.ref.Cleanerpour gérer les ressources.

Java permet de définir une telle méthode, qui est appelée avant qu'un objet ne soit détruit (collecté) par le ramasse-miettes. Cette méthode est appelée finalize(), et elle est utilisée pour nettoyer l'objet en cours de collecte.

Par exemple, vous pouvez utiliser finalize() pour vous assurer qu'un fichier ouvert par un objet est fermé.

Dans la méthode finalize(), vous devez spécifier les opérations à effectuer lorsque l'objet est détruit.

Le format général de finalize() est :

protected void finalize() { //Le code de terminaison va ici. }

Le mot-clé protected est un qualificateur qui garantit que la méthode finalize() ne sera pas appelée par du code extérieur à la classe.

Bien sûr, la récupération de mémoire de Java peut être effectuée automatiquement par la JVM. Si vous souhaitez l'utiliser manuellement, vous pouvez utiliser la méthode ci-dessus.

Exemple

Code du fichier FinalizationDemo.java :

public class FinalizationDemo { public static void main(String[] args) { Cake c1 = new Cake(1); Cake c2 = new Cake(2); Cake c3 = new Cake(3); c2 = c3 = null; System.gc(); //Appel du ramasse-miettes Java } } class Cake extends Object { private int id; public Cake(int id) { this.id = id; System.out.println("Objet Cake " + id + "est créé"); } protected void finalize() throws java.lang.Throwable { super.finalize(); System.out.println("Objet Cake " + id + "est supprimé"); } }

En exécutant le code ci-dessus, le résultat de sortie est le suivant :

$ javac FinalizationDemo.java 
$ java FinalizationDemo
Cake Object 1is created
Cake Object 2is created
Cake Object 3is created
Cake Object 3is disposed
Cake Object 2is disposed

Alternative :Il est recommandé d'utiliser l'interface AutoCloseable, combinée à une instruction try-with-resources, pour fermer automatiquement les ressources. Par exemple :

try (Resource res = new Resource()) {
    // 使用资源
} catch (Exception e) {
    e.printStackTrace();
}
Autres extensions