Surcharge en Java
Placez dans une classe deux méthodes qui portent toutes les deux le nom paint. Un en-tête est static void paint(String word). L'autre est static void paint(int n). Les corps sont courts : le premier affiche word, le second affiche n. Depuis main, appelez paint("ok"); puis paint(3);. L'écran doit montrer deux lignes : ok puis 3. Java ne traite pas le second paint comme un conflit. Il voit les deux en-têtes comme des méthodes différentes parce que les listes de paramètres diffèrent. Ce nom partagé avec des listes différentes est ce que cette page enseigne.
Même nom, listes différentes
Jusqu'ici chaque nouvelle idée utilisait un nom de méthode frais : ring, greet, twice. Ici le nom reste paint exprès. Ce qui change se trouve entre les parenthèses. Une liste contient un String. Une autre contient un int. Le compilateur garde les deux parce que ces listes ne sont pas identiques.
Créez un petit fichier programme nommé Sign.java. Le public class de la première ligne doit correspondre au nom du fichier : public class Sign. Ne laissez pas un ancien nom de classe Box ou Tip dans ce fichier ; le compilateur attend que le nom de classe et le nom de fichier concordent.
Hors de main, toujours dans les accolades de la classe, écrivez les deux en-têtes paint. Sur cette page gardez void : chaque corps affiche, et rien n'a besoin de revenir à main via return. Le premier corps utilise System.out.println(word);. Le second utilise System.out.println(n);. Enregistrez le fichier avant de compiler. Le premier programme complet est dans la boîte suivante.
Sign.java avec deux méthodes paint
C'est la version que vous compilez d'abord. main contient deux appels. La classe contient deux méthodes paint qui partagent un nom.
public class Sign {
public static void main(String[] args) {
paint("ok");
paint(3);
}
static void paint(String word) {
System.out.println(word);
}
static void paint(int n) {
System.out.println(n);
}
}
Depuis le dossier qui contient Sign.java, exécutez javac Sign.java. Quand parenthèses, accolades et points-virgules concordent, javac n'écrit aucune ligne de son côté. Puis exécutez java Sign — pas java Sign.java. Enlevez la fin .java de la seconde commande. Les deux mêmes commandes fonctionnent sous Windows et sous macOS. Le programme doit afficher deux lignes et s'arrêter : ok puis 3. Il ne doit pas attendre une saisie. Si le terminal attend le clavier, un appel nextLine d'un ancien exercice est encore dans le fichier. Supprimez-le et gardez les deux appels paint plus les deux méthodes paint ci-dessus.
Parcourez l'exécution une fois dans l'ordre. Java commence à main. Le premier appel est paint("ok"). L'argument est un String, donc Java exécute le corps qui prend String word et affiche ok. Le second appel est paint(3). L'argument est un int, donc Java exécute le corps qui prend int n et affiche 3. Le nom paint est le même les deux fois. La liste entre parenthèses choisit le corps.
Si les deux lignes montrent ok, vous n'avez peut-être laissé que la méthode String et affiché un mot fixe à chaque appel. Si les deux montrent 3, vous n'avez peut-être laissé que la méthode int. Gardez les deux en-têtes. Si javac signale que paint est déjà défini, vérifiez si les deux en-têtes ont la même liste — par exemple deux copies de paint(String word). La surcharge exige une vraie différence dans la liste, pas une seconde copie du même en-tête avec seulement un autre nom de paramètre.
Une seconde liste avec deux mots
Le nombre de paramètres peut aussi différer. Ajoutez une troisième surcharge qui prend deux valeurs String et les affiche sur une ligne avec un espace. Laissez les deux premières méthodes paint en place. Appelez la nouvelle forme depuis main après les appels précédents, ou démarrez un main frais centré sur cette forme pendant que vous l'apprenez.
public class Sign {
public static void main(String[] args) {
paint("hi", "sam");
}
static void paint(String a, String b) {
System.out.println(a + " " + b);
}
}
Compilez et exécutez à nouveau après l'enregistrement : javac Sign.java, puis java Sign. L'écran doit montrer une ligne : hi sam. L'appel a deux arguments. La méthode a deux paramètres. Cette correspondance suffit pour que Java choisisse ce corps. Si vous avez encore paint(String word) et paint(int n) dans la même classe, vous pouvez les garder. Un appel avec deux valeurs String ne choisit pas la méthode String à un argument, car les nombres diffèrent.
Quand vous mettez les trois surcharges dans un fichier pour vous entraîner, main peut appeler chaque forme sur sa propre ligne. Un appel avec un String va toujours vers paint(String word). Un appel avec un int va toujours vers paint(int n). Un appel avec deux String va vers paint(String a, String b). Le nom partagé n'efface pas ces distinctions.
Liste vide à côté d'une liste String
Une méthode avec des parenthèses vides est aussi une liste différente. Vous pouvez garder paint() sans paramètres à côté de paint(String word). L'appel vide paint(); exécute le corps à liste vide. L'appel paint("go"); exécute le corps String.
public class Sign {
public static void main(String[] args) {
paint();
paint("go");
}
static void paint() {
System.out.println("ready");
}
static void paint(String word) {
System.out.println(word);
}
}
Après javac Sign.java et java Sign, l'écran doit montrer ready sur la première ligne et go sur la seconde. Le premier appel n'a rien entre les parenthèses, donc il correspond à paint(). Le second envoie un String, donc il correspond à paint(String word). Renommer l'une en paintReady compilerait aussi, mais c'est une autre compétence. Cette page garde le nom paint et laisse les listes porter la différence.
Quel appel exécute quel en-tête
Lisez les appels à côté des en-têtes. La liste d'arguments de l'appel doit correspondre à la liste de paramètres de l'en-tête. Sur cette forme débutant, le type et le nombre comptent.
📊 call beside matching paint
| Appel dans main | En-tête exécuté | Ligne à l'écran |
|---|---|---|
paint("ok"); |
paint(String word) |
ok |
paint(3); |
paint(int n) |
3 |
paint("hi", "sam"); |
paint(String a, String b) |
hi sam |
paint(); |
paint() |
ready |
Une erreur fréquente est d'écrire deux méthodes qui disent toutes les deux paint(String word) et d'attendre que la seconde compte comme une surcharge. Changer seulement le nom du paramètre en paint(String label) ne crée pas une nouvelle liste pour le compilateur. Ici le type et le nombre comptent. Une autre erreur est d'appeler paint(true) alors que vous n'avez jamais écrit une liste de paramètres boolean. Alors javac ne trouve pas de paint correspondant. Ajoutez un en-tête qui prend le type voulu, ou changez l'appel vers un type que vous gérez déjà.
Écrire System.out.println("paint"); dans main affiche le mot paint. Cela n'appelle aucune méthode. Gardez paint("ok"); quand vous voulez la surcharge qui prend un String. Laisser un twice restant d'un ancien fichier Box dans Sign.java peut brouiller l'écran si main imprime encore twice(7). Réduisez main aux appels paint que vous testez, et ne gardez que les surcharges paint nécessaires pour cette exécution.
N'imbriquez pas une méthode paint dans les accolades de main. Les méthodes sont dans la classe, à côté de main. Deux surcharges sont deux méthodes sœurs dans ce même corps de classe.
Avant scope
Vous pouvez garder un nom de méthode et plusieurs listes de paramètres dans la même classe. Java choisit le corps d'après la liste d'arguments de l'appel. L'écran montre la ligne du corps correspondant. Deux en-têtes avec la même liste ne sont pas des surcharges. La page suivante est scope ; vous y verrez quels noms sont visibles dans une méthode et lesquels restent dehors.
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut