En Java, el polimorfismo se divide en dos tipos: polimorfismo en tiempo de compilación (sobrecarga) y polimorfismo en tiempo de ejecución (sobrescribir). El polimorfismo en el tiempo de compilación también se llama preenfalización, y el polimorfismo en tiempo de ejecución también se llama post-vinculación.
Aquí hay un ejemplo:
public class OverloadandoverWrite {public static void main (string [] args) {a a1 = new a (); A a2 = nuevo B (); B b = nuevo b (); C c = nuevo c (); D d = nuevo d (); System.out.print ("A1.print (A1):"); a1.print (a1); // salida a y un sistema.out.print ("a1.print (b):"); a1.print (b); // Salida A y A: La razón es que no hay método con el parámetro B en A, por lo que se llamará el método con el parámetro A, porque B es el sistema.out.print ("a1.print (c):"); A1.print (c); // Salida A y A: La razón es que no hay un método con el parámetro C en A, por lo que se llamará el método con el parámetro A, porque C se hereda de B y B se hereda de un sistema.out.print ("a1.print (d):"); a1.print (d); // Salida A y D: La razón es que debido a que hay un método con el parámetro D en A, el método con el parámetro D se llamará System.out.print ("A2.print (b):"); A2.print (b); // Salida B y A: la razón es que la entrada es A. Primero, verifique si hay un método de impresión con el parámetro B en A. Si encuentra que no hay no, busque un método con el parámetro A. porque B hereda de A. Encontré que dicho método existe. Luego, verifique nuevamente si este método ha sido reescrito en B. Se encuentra que hay un método de reescritura. Llame directamente al método de reescritura System.out.print ("A2.print (c):"); a2.print (c); // Salida B y A: La razón es que la entrada es A. Primero, verifique si hay un método de impresión con el parámetro C en A. En A. Si no hay, entonces busque si hay un método con el parámetro B. Debido a que C se herede desde B y no existe tal método, entonces busque un método de impresión con el parámetro A. Beins de A. Si existe un método, luego verifica si este método se reescribe en B. B. Existe un método de parámetro en Bitting directamente Bitting el método de rewrite directamente el método de rewrite directamente el método de rewrite directamente. System.out.print ("A2.print (d):"); A2.print (d); // Salida A y D: La razón es que la entrada es A. Si hay un método con el parámetro D en A, verifique que este método no haya sido reescrito en B. Por lo tanto, el resultado de este método en A IS salida; System.out.print ("A2.print (A2):"); A2.print (A2); // Salida B y A; la razón es que el tipo de A2 es A, por lo que se llamará el método de impresión con el parámetro A en A, pero el nuevo a la derecha de A2 es B, por lo que hay un método con el parámetro A en B, este método en B es adoptado System.out.print ("B.Pint (B):");; B.print (b); // Salida B y B; Razón: la entrada es B, así que verifique si la función de impresión con el parámetro B existe en B, y si hay una salida directa; System.out.print ("B.print (c):"); B.print (c); // Salida B y B; Razón: la entrada es B, por lo que si ve si la función de impresión con el parámetro C existe en B. Si encuentra que no existe, entonces ve si existe la función de impresión con el parámetro B. Si encuentra que existe, y si el método no se reescribe en C, lo emitirá directamente; Una cosa a tener en cuenta es que también debe verificar si el método de impresión con el parámetro C existe en A, porque B hereda de A. Si hay alguno, usará este método con el resultado. De esta manera, el resultado de salida se convertirá en un sistema A y C.out.print ("B.print (d):"); B.print (d); // Salida A y D; Razón: la entrada es B. Aunque no hay función de impresión con el parámetro D en B, B hereda de A. Hay una función de impresión con el parámetro D en A, por lo que la salida es el resultado del parámetro D en A; }} Clase A {public void print (a a) {system.out.println ("a y a"); } public void imprim (d d) {System.out.println ("A y D"); } // imprime public void (c c) // {// system.out.println ("a y c"); //}} La clase B extiende una impresión {public void (B B) {System.out.println ("B y B"); } public void print (a a) {System.out.println ("B y A"); }} La clase C se extiende B {} La clase D extiende C {}Lo que debe explicarse aquí es:
Para un A2 = nuevo B ();
Si A2 se imprime por separado, el resultado de la impresión es B@(código hash) en lugar de un@(código hash), pero esto no significa que el tipo de A2 sea del tipo B, porque cuando llamamos A2.print (A2); En el programa anterior, el resultado de la salida es B y A en lugar de A y A (se supone que A2 es B, el método de impresión con el parámetro B en la clase A debe llamarse, porque no existe tal método, entonces la segunda opción para llamar a un método con el parámetro A debe emitir A y A, porque B es una subclase de A).
Lo anterior es un análisis de código de ejemplo de reescritura y sobrecarga. Espero que sea útil para los estudiantes que estudian Java.