Em Java, o polimorfismo é dividido em dois tipos: polimorfismo em tempo de compilação (sobrecarga) e polimorfismo em tempo de execução (substituição). O polimorfismo em tempo de compilação também é chamado de pré-ligação, e o polimorfismo em tempo de execução também é chamado de pós-ligação.
Aqui está um exemplo:
classe pública sobrecarregar eWRITE {public static void main (string [] args) {a a1 = new a (); A2 = novo b (); B b = novo b (); C c = novo c (); D d = novo d (); System.out.print ("A1.print (A1):"); a1.print (a1); // saída a e um sistema.out.print ("a1.print (b):"); A1.Print (b); // Saída A e A: O motivo é que não existe um método com o parâmetro B em A, portanto, o método com o parâmetro A será chamado, porque B é o sistema.out.print ("A1.print (c):"); a1.print (c); // Saída A e A: O motivo é que não existe um método com o parâmetro C em A, portanto, o método com o parâmetro A será chamado, porque C é herdado de B e B é herdado de um sistema.out.print ("A1.print (d):"); A1.Print (d); // Saída A e D: O motivo é que, porque existe um método com o parâmetro d em a, o método com o parâmetro d será chamado de sistema.out.print ("a2.print (b):"); A2.Print (B); // Saída B e A: O motivo é que a entrada é A. Primeiro, verifique se existe um método de impressão com o parâmetro B em A. Se você achar que não existe, procure um método com o parâmetro A. porque B herda A. Descobri que existe um método. Em seguida, verifique novamente se esse método foi reescrito em B. Verifica -se que existe um método de reescrita. Chame diretamente o Method System.out.print ("a2.Print (c):"); A2.Print (c); // Saída B e A: O motivo é que a entrada é A. Primeiro, verifique se existe um método de impressão com o parâmetro C em A. Se não houver, procure se existe um método com o parâmetro B. porque C é herdado de B e não existe um método, então procure um método de impressão com o parâmetro A. Porque B de A., se existe um método, verifique se esse método é ree System.out.print ("A2.Print (d):"); A2.Print (d); // Saída A e D: O motivo é que a entrada é A. Se houver um método com o parâmetro D em A, verifique se esse método não foi reescrito em B. Portanto, o resultado desse método em A é saída; System.out.print ("A2.Print (A2):"); A2.Print (A2); // Saída B e A; O motivo é que o tipo de A2 é A, portanto, o método de impressão com o parâmetro A em A será chamado, mas o novo à direita de A2 é B, portanto, porque existe um método com o parâmetro A em B, este método no B é adotado System.out.Int ("B. B.P): B):"); B.Print (B); // Saída B e B; Motivo: a entrada é B, portanto, verifique se a função de impressão com o parâmetro B existe em B e se houver uma saída direta; System.out.print ("B.Print (c):"); B.Print (C); // Saída B e B; Motivo: a entrada é B; portanto, se você perceber se a função de impressão com o parâmetro C existe em B. Se você achar que ela não existe, você verá se a função de impressão com o parâmetro B existe. Se você achar que existe e se o método não for reescrito em C, você o produzirá diretamente; Uma coisa a observar é que você também precisa verificar se o método de impressão com o parâmetro C existe em A, porque B herda de A. Se houver algum, você usará esse método com o resultado. Dessa maneira, o resultado da saída se tornará um e C System.out.print ("B.Print (d):"); b.print (d); // saída A e D; Motivo: a entrada é B. Embora não haja função de impressão com o parâmetro D em B, B herdos de A. Existe uma função de impressão com o parâmetro d em a, portanto a saída é o resultado do parâmetro d em A; }} classe A {public void print (a a) {System.out.println ("a e a"); } public void print (d d) {System.out.println ("A e D"); } // public void print (c c) // {// System.out.println ("a e c"); //}} classe B estende uma {public void Print (b b) {System.out.println ("B e B"); } public void print (a a) {System.out.println ("b e a"); }} classe C estende B {} classe D estende C {}O que precisa ser explicado aqui é:
Para um a2 = novo b ();
Se A2 for impresso separadamente, o resultado da impressão será B@(código de hash) em vez de um@(código de hash), mas isso não significa que o tipo de A2 seja do tipo B, porque quando chamamos A2.Print (A2); No programa acima, o resultado da saída é B e A em vez de A e A (se A2 for considerado B, o método de impressão com o parâmetro B na classe A deve ser chamado, porque não existe esse método, então a segunda opção de chamar um método com o parâmetro A deve a saída A e A, porque B é uma subclasse de A).
O exposto acima é um exemplo de análise de código de reescrita e sobrecarga. Espero que seja útil para os alunos que estudam Java.