Cet article utilise des exemples pour analyser en détail la différence entre la surcharge et la réécriture en Java. Les amis intéressés peuvent s'y référer.
1. Surcharge :
(1) La surcharge de méthodes est un moyen pour une classe de gérer différents types de données de manière unifiée. Plusieurs fonctions portant le même nom existent en même temps, avec un nombre/type de paramètres différent.
La surcharge est une manifestation du polymorphisme dans une classe.
(2) La surcharge de méthodes Java signifie que plusieurs méthodes peuvent être créées dans une classe. Elles ont le même nom mais des paramètres et des définitions différents.
Lorsque vous appelez des méthodes, vous décidez quelle méthode utiliser en fonction du nombre et du type de paramètres qui leur sont transmis. Il s'agit du polymorphisme.
(3) Lors de la surcharge, les noms de méthodes doivent être les mêmes, mais les types et les numéros de paramètres sont différents et les types de valeurs de retour peuvent être identiques ou différents. Le type de retour ne peut pas être utilisé comme critère pour distinguer les fonctions surchargées.
Voici un exemple de surcharge :
package c04.answer;//Voici le nom du package//Il s'agit de la première méthode de programmation de ce programme. Créez d'abord une instance de classe Dog dans la méthode principale, puis utilisez le mot-clé this dans le constructeur de la classe Dog pour appeler. méthode d'écorce différente. Différentes méthodes surchargées se distinguent en fonction de leurs types de paramètres. //Remarque : le compilateur interdit d'appeler le constructeur ailleurs que chez le constructeur. package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark() est une méthode surchargée {System.out.println(/"no barking!/"); this.bark(/"female/", 3.4);}void bark(String m,double l)//Remarque : les valeurs de retour des méthodes surchargées sont les mêmes, {System.out.println(/"a barking dog!/");this.bark(5, /"China/");} void bark(int a,String n)//Les méthodes surchargées ne peuvent pas être distinguées par la valeur de retour, mais ne peuvent être distinguées que par le "type de paramètre" et le "nom de classe" {System.out.println(/"un chien hurlant/") ; }public static void main(String[] args){Chien chien = new Dog();//dog.bark(); [Page]//dog.bark(/"male/", /"jaune/");//dog.bark(5, / "Chine/");
2. Remplacement
(1) Polymorphisme entre la classe parent et la sous-classe, redéfinissant les fonctions de la classe parent. Si une méthode définie dans une sous-classe a le même nom et les mêmes paramètres que sa classe parent, on dit que la méthode est prioritaire. Dans , les sous-classes peuvent hériter des méthodes de la classe parent sans avoir à réécrire les mêmes méthodes.
Mais parfois, la sous-classe ne souhaite pas hériter des méthodes de la classe parent inchangées, mais souhaite apporter certaines modifications, ce qui nécessite une réécriture des méthodes.
Le remplacement de méthode est également appelé remplacement de méthode.
(2) Si une méthode de la sous-classe a le même nom de méthode, le même type de retour et la même liste de paramètres qu'une méthode de la classe parent, la nouvelle méthode écrasera la méthode d'origine.
Si vous avez besoin de la méthode originale dans la classe parent, vous pouvez utiliser le mot-clé super, qui fait référence à la classe parent de la classe actuelle.
(3) Les autorisations de modification d'accès des fonctions de sous-classe ne peuvent pas être inférieures à celles de la classe parent ;
Voici un exemple de réécriture :
Concept : Le mécanisme d'appel des méthodes objet.
La vérité sur la liaison dynamique :
1. Le compilateur vérifie le type et le nom de méthode déclarés par l'objet pour obtenir toutes les méthodes candidates. Essayez de commenter le test de la classe Base dans l'exemple ci-dessus, et la compilation échouera.
2. Décision de surcharge : le compilateur vérifie le type de paramètre de l'appel de méthode et sélectionne le seul parmi les méthodes candidates ci-dessus (il y aura une conversion de type implicite pendant ce processus).
Si le compilateur en trouve plusieurs ou aucun, il signalera une erreur. Essayez de commenter le test (octet b) de la classe Base dans l'exemple ci-dessus, et le résultat en cours d'exécution est 1 1.
3. Si le type de méthode est priavte static final et que Java utilise la compilation statique, le compilateur saura exactement quelle méthode appeler.
4. Lorsque le programme s'exécute et utilise la liaison dynamique pour appeler une méthode, la machine virtuelle doit appeler la version de la méthode qui correspond au type réel de l'objet.
Dans l'exemple, le type réel pointé par b est TestOverriding, donc b.test(0) appelle le test de la sous-classe.
Cependant, la sous-classe ne remplace pas test(byte b), donc b.test((byte)0) appelle test(byte b) de la classe parent.
Si le (octet b) de la classe parent est commenté, le type implicite est converti en int dans la deuxième étape et le test (int i) de la sous-classe est finalement appelé.
3. Résumé de l'apprentissage :
Le polymorphisme est une fonctionnalité de la programmation orientée objet et n'a rien à voir avec les méthodes.
Pour faire simple, la même méthode peut effectuer différents traitements en fonction de différentes données d'entrée, c'est-à-dire une surcharge de méthode - avec différentes listes de paramètres (polymorphisme statique)
Lorsqu'une sous-classe hérite de la même méthode de la classe parent et utilise les mêmes données d'entrée, mais souhaite répondre différemment de la classe parent, vous devez remplacer la méthode de la classe parent.
Autrement dit, réécrivez cette méthode dans une sous-classe - mêmes paramètres, implémentations différentes (polymorphisme dynamique)
Les trois caractéristiques majeures de la POO : l'héritage, le polymorphisme et l'encapsulation.
classe publique Base{void test(int i){System.out.print(i);}void test(byte b){System.out.print(b);}} classe publique TestOverriding étend Base{void test(int i) ){i++;System.out.println(i);}public static void main(String[]agrs){Base b=new TestOverriding();b.test(0)b.test((byte)0)}}
Le résultat de sortie à ce moment est 1 0, qui est le résultat d'une liaison dynamique au moment de l'exécution.
Le principal avantage de la substitution est la possibilité de définir des caractéristiques spécifiques à une sous-classe :
publicclassFather{publicvoidspeak(){System.out.println(Père);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("fils");}}
C'est ce qu'on appelle également le polymorphisme. Les méthodes de substitution ne peuvent exister que dans des relations d'héritage. Les méthodes de substitution ne peuvent que remplacer les méthodes non privées de la classe parent.
Lorsque la méthode speak() de la classe Father est privée dans l'exemple ci-dessus, la classe Son ne peut pas remplacer la méthode speak() de la classe Father. À l'heure actuelle, la méthode speak() de la classe Son est équivalente à une méthode speak() définie dans le fichier. Classe de fils.
Une fois que la méthode speak() de la classe Father est définitive, que la méthode soit modifiée par public, protected ou default, la classe Son ne peut pas du tout remplacer la méthode speak() de la classe Father.
Lorsque vous essayez de compiler le code, le compilateur génère une erreur. exemple:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//Le compilateur signalera une erreur ;
Lorsque la méthode speak() de la classe Father est modifiée par défaut, elle ne peut être remplacée que par ses sous-classes dans le même package. Si elle n'est pas dans le même package, elle ne peut pas être remplacée.
Lorsque la méthode speak() de la classe Father est prototypée, elle est non seulement remplacée par ses sous-classes dans le même package, mais peut également être remplacée par des sous-classes de différents packages.
Règles pour remplacer les méthodes :
1. La liste des paramètres doit être exactement la même que la méthode remplacée, sinon elle ne peut pas être appelée réécriture mais surcharge.
2. Le type de retour doit toujours être le même que le type de retour de la méthode remplacée, sinon cela ne peut pas être appelé écrasement mais surcharge.
3. La limite du modificateur d'accès doit être supérieure au modificateur d'accès de la méthode remplacée (public>protected>default>private)
4. La méthode substituée ne doit pas lever une nouvelle exception vérifiée ou une exception vérifiée plus large que la déclaration de la méthode substituée. Par exemple:
Une méthode de la classe parent déclare une exception vérifiée IOException. Lors de la substitution de cette méthode, vous ne pouvez pas lever d'exception. Vous pouvez uniquement lever des exceptions de sous-classes de IOException, et vous pouvez lever des exceptions non vérifiées.
Et les règles surchargées :
1. Doit avoir différentes listes de paramètres ;
2. Vous pouvez avoir un type de retour non blâmable, tant que la liste des paramètres est différente ;
3. Il peut y avoir différents modificateurs d'accès ;
4. Différentes exceptions peuvent être levées ;
La différence entre la réécriture et la surcharge est la suivante :
La substitution du polymorphisme fonctionne. Cela peut réduire considérablement la quantité de code saisie lors de l'appel de méthodes surchargées. Le même nom de méthode peut avoir différentes fonctions ou renvoyer des valeurs tant que différents paramètres y sont transmis.
En faisant bon usage de la réécriture et de la surcharge, vous pouvez concevoir une classe avec une structure claire et concise. On peut dire que la réécriture et la surcharge jouent un rôle extraordinaire dans le processus d'écriture du code.