В Java полиморфизм разделен на два типа: полиморфизм времени компиляции (перегрузка) и полиморфизм времени выполнения (перезапись). Полиморфизм времени компиляции также называется предварительной связью, а полиморфизм времени выполнения также называется постсвязанностью.
Вот пример:
Public Class RealloadandOverwrite {public static void main (string [] args) {a a1 = new a (); A A2 = новый b (); B b = new b (); C C = новый c (); D d = new d (); System.out.print ("a1.print (a1):"); a1.print (a1); // Выход A и A System.out.print ("a1.print (b):"); a1.print (b); // Выход A и A: Причина в том, что нет метода с параметром B в A, поэтому будет вызван метод с параметром A, потому что B - System.out.print ("a1.print (c):"); a1.print (c); // Выход A и A: Причина в том, что не существует метода с параметром C в A, поэтому будет вызван метод с параметрами a, поскольку C унаследован от B, а B унаследован от System.out.print ("a1.print (d):"); a1.print (d); // Выход A и D: причина в том, что, поскольку существует метод с параметрами d в A, метод с параметром D будет называться System.out.print ("a2.print (b):"); a2.print (b); // Выход B и A: Причина в том, что запись A. Во -первых, проверьте, существует ли метод печати с параметром B в A. Если вы обнаружите, что нет, то ищите метод с параметрами A. Потому что B наследует от A. Я обнаружил, что такой метод существует. Затем проверьте, был ли этот метод переписан у B. Установлено, что существует метод переписывания. Непосредственно вызовите систему метода перезаписывания. a2.print (c); // Вывод B и A: Причина в том, что запись составляет A. A. Во -первых, проверьте, существует ли метод печати с параметром C в A. Если нет, то ищите, есть ли метод с параметром B. Поскольку C унаследован от B, и нет такого метода, а затем ищите метод печати с параметрами A. Потому что B Forhishits от A. Если есть такой метод, метод перевертируется, если это повторное метод. System.out.print ("a2.print (d):"); a2.print (d); // Выход A и D: причина в том, что запись составляет A. Если есть метод с параметром D в A, проверьте, что этот метод не был переписан в B. Следовательно, результат этого метода в A IS -выходе; System.out.print ("a2.print (A2):"); a2.print (a2); // Выход B и A; причина в том, что тип A2 - это A, поэтому метод печати с параметрами a в a B.print (b); // Выход B и B; Причина: вход - B, поэтому проверьте, существует ли функция печати с параметром B в B, и если есть прямой вывод; System.out.print ("b.print (c):"); B.print (c); // Выход B и B; Причина: запись - B, поэтому, если вы видите, существует ли функция печати с параметрами C в B. Если вы обнаружите, что ее не существует, то вы посмотрите, существует ли функция печати с параметром B. Если вы обнаружите, что он существует, и если метод не переписывается в C, то вы напрямую выведете его; Обратите внимание, что вам также необходимо проверить, существует ли метод печати с параметром C в A, потому что B наследники от A. Если есть, вы будете использовать этот метод с результатом. Таким образом, результат вывода станет a и c System.out.print ("b.print (d):"); B.print (d); // Выход A и D; Причина: вход - B. Хотя нет функции печати с параметрами D в B, B наследниках от A. Существует функция печати с параметром D в A, поэтому выход является результатом параметра D в A; }} класс A {public void print (a a) {System.out.println ("a и a"); } public void print (d d) {System.out.println ("a and d"); } // public void print (c c) // {// system.out.println ("a и c"); //}} класс B расширяет {public void print (b b) {system.out.println ("b и b"); } public void print (a a) {System.out.println ("b и a"); }} класс C Extends b {} класс D Extends c {}Что нужно объяснить здесь:
Для a2 = new b ();
Если A2 печатается отдельно, результатом печати является b@(хэш -код) вместо@(хэш -код), но это не означает, что тип A2 имеет тип B, потому что, когда мы называем A2.print (A2); В вышеупомянутой программе результат вывода - B и A вместо A и A (если A2 предполагается, что это B, следует вызывать метод печати с параметром B в классе A, потому что такого метода нет, то второй выбор для вызова метода с параметрами A должен выводить A и A, потому что B является подклассом A).
Выше приведено примером анализа кода перезагрузки и перегрузки. Я надеюсь, что это будет полезно для студентов, изучающих Java.