étudier "craquer l'entretien de codage" en Java, à la page 51 Je suis tombé sur:
void permutation(String str){ permutation(str,""); } void permutation(String str, String prefix){ if(str.length()==0){ System.out.println(prefix); } else{ for(int i=0;i<str.length();i++){ String rem=str.substring(0,i)+str.substring(i+1); permutation(rem,prefix+str.charAt(i)); } } }
4 Réponses :
en Java, toute la classe est chargée avant que une méthode soit exécutée. P>
Cela signifie que la deuxième méthode est chargée / prête avant que la première méthode est exécutée et que la première méthode est chargée / prête avant que la seconde méthode soit exécutée. P>
Ceci permet d'appeler une méthode récursive et d'appeler une méthode qui sera déclarée plus tard. P>
En outre, la méthode est En Java, il est possible de créer plusieurs méthodes avec le même nom dans la même classe si les paramètres sont différents. Les méthodes seront traitées comme différentes, déoendant de l'argument transmis à la méthode. P>
En d'autres termes, le nom seul ne définit pas quelle méthode est appelée mais
Comment cela répond-il à la question?
Comment Java va-t-il reconnaître et utiliser la première fonction de permutation? em> p>
Lorsque vous appelez la méthode, Java verra ce que vous essayez de passer. Basé sur les arguments que vous passez, il décidera de la "version" de la méthode que vous essayez d'utiliser. P>
Comme les autres ont dit - ceci est la surcharge de la méthode p>
IMPORTANT: la décision est effectuée sur les types B> statiques b>, pas les types dynamique b> des paramètres réels.
Contrairement à Python, en Java, ces deux déclarations vivent côte à côte - la seconde ne remplace pas le premier. En Java, la règle est à peu près que lorsque vous appelez une méthode avec plusieurs définitions (aka une méthode "surchargée"), Java recherchera celui qui correspond le mieux aux arguments que vous avez appelés et exécutez cette méthode. Donc La différence fondamentale ici est que, dans Python, vous pouvez imaginer l'interprète de lire les définitions une à la fois et en remplaçant sa définition globale de (une conséquence de cela est que Java vérifie également à la compilation de la compilation que chaque version surchargée d'une méthode est appelable: Par exemple, si vous avez écrit deux versions de permutation ("hi") code> invoque la première version et
permutation ("hi", "") code> appelle la seconde. P>
permutation code> chaque fois qu'il reçoit une nouvelle définition. En Java, vous devez y penser comme une lecture tous les em> les définitions de
permutation code> à la fois et appelez le plus approprié pour une invocation donnée. P>
permutation code> qui ont pris juste une chaîne Comme leur argument, le compilateur vous donnerait une erreur et ne compilerait pas du tout votre programme. Dans Python, vous obtiendrez simplement la deuxième définition.) P>
Expliquer ce que sont les sémantiques, nous devons examiner comment les méthodes Java sont différenciées.
en Java, une méthode est identifiée par sa signature. JLS §8.4.2 Spécifie que P>
Deux méthodes ont la même signature si elles ont le même nom et les mêmes types d'arguments. P> BlockQuote>
Il est important de noter que le type de retour d'une méthode est
pas strong> partie de la signature d'une méthode. Ainsi, si on écrirait: p> public class Test { public static void main(final String... args) { final String s = "foo"; final Object o = s; print(s); print(o); } private static void print(final String s) { System.out.println("Called with String parameter"); } private static void print(final Object o) { System.out.println("Called with Object parameter"); } }
Est-ce peut-être ce qu'on appelle "la surcharge de la méthode"?
Ceci s'appelle surcharge. La méthode est définie par sa signature. La signature consiste en le nom de la fonction, ainsi que les types des paramètres (dans l'ordre). Le type de retour ne fait pas partie de la signature de méthode. Les détails des signatures de méthode sont définis dans JLS, §8.4.2 .
Cela ne sera pas écrasé. Ceci s'appelle Surcharge de la méthode i>
Ceci est surcharge, que Python ne prend pas en charge (qu'il ne peut être utile de manière utile car Python n'est pas une langue typée de manière statique). En Python, les fonctions sont des objets de première classe et lorsque vous appelez une fonction, il résout quel que soit l'objet de fonction, le nom ou la référence que vous utilisez réellement. En Java, le compilateur permet de déterminer quelle méthode réelle est en train d'être Caleld sur la base du nom et de la signature.
Remarque, une distinction importante, Python n'a pas de déclarations variables / fonctions b>. Java fait.