En Java, le polymorphisme est divisé en deux types: le polymorphisme à temps de compilation (surcharge) et le polymorphisme d'exécution (écrasement). Le polymorphisme à temps de compilation est également appelé pré-liaison, et le polymorphisme d'exécution est également appelé post-liaison.
Voici un exemple:
classe publique OverloadAndOverWrite {public static void main (String [] args) {a a1 = new a (); A a2 = new B (); B b = nouveau b (); C C = nouveau C (); D d = new D (); System.out.print ("A1.print (A1):"); A1.print (a1); // Sortie A et A System.out.print ("A1.print (B):"); A1.print (b); // Sortie A et A: La raison en est qu'il n'y a pas de méthode avec le paramètre B dans A, donc la méthode avec le paramètre A sera appelée, car B est le System.out.print ("A1.print (C):"); A1.print (C); // Sortie A et A: La raison en est qu'il n'y a pas de méthode avec le paramètre C dans A, de sorte que la méthode avec le paramètre A sera appelée, car C est hérité de B, et B est hérité d'un System.out.print ("A1.print (D):"); A1.print (d); // Sortie A et D: La raison en est que parce qu'il existe une méthode avec le paramètre D dans A, la méthode avec le paramètre D sera appelée System.out.print ("A2.print (b):"); A2.Print (B); // Sortie B et A: La raison en est que l'entrée est A. Tout d'abord, vérifiez s'il existe une méthode d'impression avec le paramètre B dans A. Si vous trouvez qu'il n'y a pas, alors recherchez une méthode avec le paramètre A. parce que B hérite de A. J'ai trouvé qu'une telle méthode existe. Vérifiez ensuite si cette méthode a été réécrite dans B. Il est constaté qu'il existe une méthode de réécriture. Appelez directement la méthode de réécriture System.out.print ("A2.print (C):"); A2.print (c); // Sortie B et A: la raison en est que l'entrée est A. Tout d'abord, vérifiez s'il existe une méthode d'impression avec le paramètre C dans A. S'il n'y a pas, alors recherchez s'il existe une méthode avec le paramètre B. car C est hérédit System.out.print ("A2.print (D):"); A2.print (d); // Sortie A et D: La raison en est que l'entrée est A. S'il existe une méthode avec le paramètre D dans A, vérifiez que cette méthode n'a pas été réécrite dans B. Par conséquent, le résultat de cette méthode dans A IS de sortie; System.out.print ("A2.print (A2):"); A2.print (A2); // Sortie B et A; La raison en est que le type de A2 est A, donc la méthode d'impression avec le paramètre A dans A sera appelée, mais la nouvelle à droite de A2 est B, donc parce qu'il existe une méthode avec le paramètre A en B, cette méthode en B est adoptée System.out.print ("B.Print (B):"); B.Print (B); // Sortie B et B; Raison: l'entrée est B, alors vérifiez si la fonction d'impression avec le paramètre B existe en B, et s'il y a une sortie directe; System.out.print ("B.print (c):"); B.Print (C); // Sortie B et B; Raison: l'entrée est B, donc si vous voyez si la fonction d'impression avec le paramètre C existe dans B. Si vous trouvez qu'il n'existe pas, vous voyez si la fonction d'impression avec le paramètre B existe. Si vous constatez qu'il existe, et si la méthode n'est pas réécrite en C, vous le publierez directement; Une chose à noter est que vous devez également vérifier si la méthode d'impression avec le paramètre C existe dans A, car B hérite de A. S'il y en a, vous utiliserez cette méthode avec le résultat. De cette façon, le résultat de sortie deviendra A et C System.out.print ("B.print (D):"); B.Print (D); // Sortie A et D; Raison: l'entrée est B. Bien qu'il n'y ait pas de fonction d'impression avec le paramètre D dans B, B hérite de A. Il existe une fonction d'impression avec le paramètre D dans A, donc la sortie est le résultat du paramètre D dans A; }} classe a {public void print (a a) {System.out.println ("a et a"); } public void print (d d) {System.out.println ("a et d"); } // public void print (c c) // {// system.out.println ("a et c"); //}} classe B étend un {public void print (b b) {System.out.println ("b et b"); } public void print (a a) {System.out.println ("b et a"); }} La classe C étend B {} La classe D étend C {}Ce qui doit être expliqué ici est:
Pour a a2 = new b ();
Si A2 est imprimé séparément, le résultat d'impression est B @ (code de hachage) au lieu d'un @ (code de hachage), mais cela ne signifie pas que le type d'A2 est de type B, car lorsque nous appelons A2.print (A2); Dans le programme ci-dessus, le résultat de sortie est B et A au lieu de A et A (si A2 est supposé être B, la méthode d'impression avec le paramètre B dans la classe A doit être appelée, car il n'y a pas de méthode de ce type, alors le deuxième choix pour appeler une méthode avec le paramètre A devrait sortir A et A, car B est une sous-classe de A).
Ce qui précède est un exemple d'analyse de code de la réécriture et de la surcharge. J'espère que cela sera utile aux étudiants qui étudient Java.