Maison  >  Article  >  Java  >  Pourquoi passer « null » à une méthode surchargée en Java appelle-t-il la méthode avec le paramètre « String » ?

Pourquoi passer « null » à une méthode surchargée en Java appelle-t-il la méthode avec le paramètre « String » ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 02:35:02909parcourir

Why does passing `null` to an overloaded method in Java call the method with the `String` parameter?

Surcharge de méthode et sélection de paramètres nuls

En Java, lorsqu'une méthode est surchargée, plusieurs méthodes existent avec le même nom mais des listes de paramètres différentes . Lorsqu'un appel de méthode est effectué, le compilateur détermine quelle méthode surchargée appeler en fonction du nombre et des types des arguments réels transmis.

Considérez l'extrait de code suivant :

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

Question :Pourquoi le passage d'une valeur nulle à la méthode surchargée appelle-t-il la version de la méthode (String) ?

Réponse :

En Java, null est une valeur constante spéciale qui représente une référence à un objet qui n'existe pas. Il ne s'agit pas d'une valeur d'un type particulier, mais elle peut être affectée à une variable de n'importe quel type de référence, y compris Object et String.

Lorsque l'invocation de la méthode est effectuée avec null comme argument, le compilateur choisit le méthode (String) car elle est plus spécifique que la version méthode (Object). Selon la spécification du langage Java (JLS), la surcharge la plus spécifique est choisie en fonction de son applicabilité et de sa spécificité.

L'applicabilité fait référence à la question de savoir si les arguments peuvent être transmis à la méthode sans erreur de compilation. Dans ce cas, null est applicable aux deux méthodes car il peut être attribué à des variables de type Objet et Chaîne.

La spécificité mesure le degré de spécialisation de la méthode pour les arguments donnés. Dans ce cas, la surcharge method(String) est plus spécifique car elle est conçue pour gérer uniquement les arguments de type String. La surcharge de méthode (Object) est plus générale car elle peut gérer des arguments de type Object ou l'une de ses sous-classes.

Par conséquent, le compilateur sélectionne la version de la méthode (String) car elle est plus spécifique et applicable au argument, qui est une référence nulle.

Remarque : Si une deuxième méthode surchargée avec StringBuffer comme type de paramètre est ajoutée à la classe MoneyCalc, une erreur de compilation se produirait. En effet, ni méthode(String) ni méthode(StringBuffer) ne seraient plus spécifiques que l'autre dans ce cas, ce qui entraînerait une ambiguïté dans la sélection de la méthode.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn