Comme mentionné précédemment, la surcharge de résolution est effectuée au moment de la compilation.
Java casse-têtes est un bel exemple:
Puzzle 46: Le Cas de la Confusion de Constructeur
Ce puzzle, vous présente deux de Confusion des constructeurs. La principale méthode appelle un constructeur,
mais lequel? Le programme de sortie dépend de la réponse. Quel est le programme d'impression, ou est-il
même légal?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Solution 46: le Cas de la Confusion Constructeur
...
Java de la résolution de surcharge processus fonctionne dans les deux phases. La première phase permet de sélectionner toutes les méthodes ou les constructeurs qui sont accessibles et applicables. La deuxième phase sélectionne les plus spécifiques des méthodes ou des constructeurs sélectionnés dans la première phase. Une méthode ou d'un constructeur est moins précis qu'un autre s'il peut accepter des paramètres passés à l'autre [JLS 15.12.2.5].
Dans notre programme, les deux constructeurs sont accessibles et applicables. Le constructeur
La confusion(Objet) accepte un paramètre passé à la Confusion(double[]), de sorte
La confusion(Objet) est moins précis. (Chaque double tableau est un Objet, mais pas tous l' Objet est un double tableau.) Le plus spécifique constructeur est donc source de Confusion(double[]), ce qui explique le programme de la sortie.
Ce comportement a de sens que si vous passez une valeur de type double[]; il est contre-intuitif si vous passez null. La clé de la compréhension de ce puzzle, c'est que le test de la méthode ou le constructeur est plus spécifique n'utilise pas les paramètres: les paramètres figurant dans l'invocation.
Ils sont uniquement utilisés pour déterminer les surcharges sont applicables. Une fois que le compilateur détermine les surcharges sont applicables et accessible, il choisit le plus spécifique de la surcharge, en utilisant uniquement les paramètres formels: les paramètres figurant dans la déclaration.
Pour appeler la Confusion(Objet) constructeur avec un null paramètre, écrire de nouveaux
La confusion((Objet)null). Cela garantit que seule la Confusion(Objet) est applicable. Plus
généralement, pour forcer le compilateur de choisir une surcharge, la fonte de paramètres à l'déclaré types des paramètres formels.