JavaRush /Blog Java /Random-FR /Signature de la méthode

Signature de la méthode

Publié dans le groupe Random-FR
Bonjour! Vous maîtrisez déjà la création de vos propres classes, avec des champs et des méthodes. Aujourd'hui, nous parlerons en détail des méthodes. Nous l'avons bien sûr fait plus d'une fois dans nos cours, mais nous avons principalement parlé de points généraux. Aujourd'hui, nous analyserons littéralement les méthodes « par parties » - nous découvrirons en quoi elles consistent, quelles options pour les créer existent et comment tout cela peut être géré :) C'est parti !Signature de la méthode - 1

Signature de la méthode

Tout code qui décrit une méthode est appelé une déclaration de méthode . Une signature de méthode inclut le nom de la méthode et les types de paramètres dans un ordre spécifique. L’apparence générale de l’annonce peut être décrite comme suit :
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Prenons un exemple de déclaration de plusieurs méthodes de classe Dog.
public class Dog {

   String name;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {
       Dog max = new Dog("Max");
       max.woof();

   }

   public void woof() {
       System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
   }

   public void run(int meters) {
       System.out.println("Собака по имени " + name + " пробежала " + meters + " метров!");
   }

   public String getName() {
       return name;
   }
}

1. Modificateur d'accès

Le modificateur d'accès est toujours répertorié en premier. Toutes les méthodes de classe Dogsont désignées par le modificateur public. Autrement dit, nous pouvons les appeler depuis n'importe quelle autre classe :
public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Бутч");
       butch.run(100);
   }

}
Les méthodes de classe Dog, comme vous pouvez le constater, sont facilement accessibles dans la classe Main. Ceci est possible grâce au modificateur public. Il existe d'autres modificateurs en Java, et tous ne vous permettront pas d'utiliser une méthode dans une autre classe. Nous en parlerons dans d'autres conférences. L'essentiel est de se rappeler de quoi le modificateur est responsable : la disponibilité/inaccessibilité de la méthode dans les autres classes :)

2. Le mot-clé statique

L'une des méthodes Dog, à savoir, main()est indiquée par le mot-clé static. S'il existe, alors il doit être spécifié après le modificateur d'accès. Vous vous souvenez que dans les cours précédents, nous avons parlé de variables de classe statiques ? Appliqué aux méthodes, ce mot a à peu près la même signification. Si une méthode est spécifiée comme static, cela signifie qu'elle peut être utilisée sans référence à un objet de classe spécifique. Et en effet, pour exécuter une méthode statique main()dans une classe, Dogvous n'avez pas besoin de créer une instance Dog; elle s'exécute sans elle. Si cette méthode n’était pas statique, pour l’utiliser, nous devrions d’abord créer un objet.

3. Valeur de retour.

Si notre méthode doit renvoyer quelque chose, alors nous indiquons alors le type de la valeur de retour. Cela peut être vu dans l'exemple d'un gettergetName() :
public String getName() {
   return name;
}
Il renvoie un objet de type String. Si la méthode ne renvoie rien, le mot clé est spécifié à la place du type void, comme dans la méthode woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Méthodes du même nom

Il existe des situations où notre programme nécessite plusieurs options pour le fonctionnement d'une méthode. Pourquoi ne créons-nous pas notre propre intelligence artificielle ? Amazon a Alexa, Yandex a Alice, alors pourquoi sommes-nous pires ? :) Dans le film sur Iron Man, Tony Stark a créé sa propre intelligence artificielle exceptionnelle - JARVIS Rendons hommage à ce merveilleux personnage et nommons notre IA en son honneur :) La première chose que nous devons apprendre à Jarvis est de saluer les gens qui entrent dans la pièce (il serait étrange qu'un si grand intellect se révèle impoli).
public class Jarvis {

   public void sayHi(String name) {
       System.out.println("Good evening, " + name + ", How are you doing?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
Sortie de la console :

Добрый вечер, Тони Старк, How ваши дела?
Super! Jarvis sait comment saluer quelqu'un qui entre. Le plus souvent, bien sûr, ce sera son propriétaire, Tony Stark. Mais il ne viendra peut-être pas seul ! Et notre méthode sayHi()ne prend qu’un seul argument en entrée. Et, par conséquent, il ne pourra saluer qu'un seul de ceux qui viendront et ignorera l'autre. Pas très poli, d'accord ? :/ Dans ce cas, pour résoudre le problème, on peut simplement écrire 2 méthodes dans la classe avec le même nom, mais avec des paramètres différents :
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

}
C'est ce qu'on appelle la surcharge de méthode . La surcharge permet à notre programme d'être plus flexible et de s'adapter à différentes options de travail. Voyons comment cela fonctionne :
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Sortie de la console :

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Super, les deux options ont fonctionné :) Cependant, nous n'avons pas résolu le problème ! Et s'il y a trois invités ? Bien entendu, nous pouvons à nouveau surcharger la méthode sayHi()pour accepter les noms de trois invités. Mais il peut y en avoir 4 ou 5. Et ainsi de suite à l’infini. Existe-t-il une autre façon d'apprendre à Jarvis à travailler avec un nombre illimité de noms, sans un million de surcharges de méthodes sayHi()? :/ Bien sûr ! Sinon, Java serait-il le langage de programmation le plus populaire au monde ? ;)
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Le record( String...names) passé en paramètre permet d'indiquer qu'un certain nombre de chaînes sont passées à la méthode. Nous ne précisons pas à l’avance combien il doit y en avoir, le fonctionnement de notre méthode devient donc désormais beaucoup plus flexible :
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
   }
}
Sortie de la console :

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
À l'intérieur de la méthode, nous parcourons tous les arguments et produisons des phrases prêtes à l'emploi avec des noms sur la console. Nous utilisons ici une boucle simplifiée for-each(vous l'avez déjà rencontrée). C'est génial car écrire String...namessignifie en fait que tous les paramètres passés sont placés dans un tableau par le compilateur. Par conséquent, namesvous pouvez travailler avec une variable comme avec un tableau, y compris en la parcourant en boucle. De plus, cela fonctionnera pour n’importe quel nombre de lignes transférées ! Deux, dix, voire mille : la méthode fonctionnera de manière fiable quel que soit le nombre d'invités. Bien plus pratique que de faire des surcharges pour toutes les options possibles, n'est-ce pas ? :) Donnons un autre exemple de surcharge de méthode. Ajoutons une méthode à Jarvis printInfoFromDatabase(). Il imprimera les informations sur la personne de la base de données vers la console. Si la base de données indique qu'une personne est un super-héros ou un super-vilain, cette information sera également affichée à l'écran :
public class Jarvis {

   public  void printInfoFromDatabase (String bio) {

       System.out.println(bio);
   }

   public void printInfoFromDatabase(String bio, boolean isEvil, String nickname) {

       System.out.println(bio);
       if (!isEvil) {
           System.out.println("Также известен How супергерой " + nickname);
       } else {
           System.out.println("Также известен How суперзлодей " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Макс Эйзенхарт. Рост 188см, вес 86 кг.", true, "Магнето");
   }
}
Conclusion:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
C'est ainsi que fonctionne notre méthode en fonction des données que nous lui transmettons. Autre point important :L’ordre des arguments compte ! Disons que notre méthode prend une chaîne et un nombre en entrée :
public class Man {

   public static void sayYourAge(String greeting, int age) {
       System.out.println(greeting + " " + age);
   }

   public static void main(String[] args) {

       sayYourAge("My age - ", 33);
       sayYourAge(33, "My age - "); //error!
   }
}
Si une méthode sayYourAge()de classe Manprend une chaîne et un nombre en entrée, alors c'est l'ordre dans lequel ils doivent être transmis dans le programme ! Si nous les transmettons dans un ordre différent, le compilateur générera une erreur et la personne ne pourra pas connaître son âge. D'ailleurs, les constructeurs que nous avons abordés dans le dernier cours sont aussi des méthodes ! Ils peuvent également être surchargés (créer plusieurs constructeurs avec différents ensembles d'arguments) et pour eux, l'ordre de passage des arguments est également fondamentalement important. De vraies méthodes ! :)

Comment appeler des méthodes avec des paramètres similaires

Comme vous le savez, en Java, il existe un mot tel que null. Lorsque vous travaillez avec, il est très important de comprendre que null n'est ni un objet ni un type de données. Imaginez que nous ayons une classe Man et une méthode introduce()qui déclare le nom et l'âge d'une personne. Dans ce cas, l’âge peut être transmis sous forme de texte ou exprimé sous forme de nombre.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man sasha = new Man();
       sasha.introduce("Sasha", "двадцать один");

       Man masha = new Man();
       masha.introduce("Мария", 32);
   }
}
Nous sommes déjà familiers avec la surcharge, nous savons donc que la méthode fonctionnera comme prévu dans les deux cas :

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Mais que se passe-t-il si nous transmettons null comme deuxième paramètre, pas une chaîne ou un nombre ?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Nous aurons une erreur de compilation ! L’erreur « Appel de méthode ambigu » est traduite par « appel de méthode ambigu ». Pourquoi cela pourrait-il survenir et quelle est « l’ambiguïté » ? C'est en fait simple. Le fait est que nous avons deux options pour la méthode : with Stringet with Integercomme deuxième argument. Mais les deux String, et Integerpeuvent être nuls ! Pour les deux types (puisqu’il s’agit de types référence), null est la valeur par défaut. C'est pourquoi le compilateur dans cette situation ne peut pas déterminer quelle version de la méthode il doit appeler. Résoudre ce problème est assez simple. Le fait est que null peut être explicitement converti en un type de référence spécifique. Ainsi, lors de l’appel d’une méthode, vous pouvez indiquer entre parenthèses le type de données dont vous avez besoin pour le deuxième argument ! Le compilateur comprendra votre « indice » et appellera la méthode requise :
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Метод со строкой и числом!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", (String) null);
   }
}
Conclusion:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Mais si le paramètre numérique était une primitive intet non un objet de type référence Integer, une telle erreur ne se produirait pas.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Метод со строкой и числом!!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", null);
   }
}
Avez-vous deviné pourquoi ? Si vous l'avez deviné, bravo :) Parce que les primitives ne peuvent pas être égales à null. Désormais, le compilateur n'a qu'une seule option pour appeler la méthode introduce()- avec deux lignes. C'est cette version de la méthode qui sera traitée à chaque appel de la méthode.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION