Java에서, 다형성은 컴파일 타임 다형성 (과부하)과 런타임 다형성 (오버 라이팅)의 두 가지 유형으로 나뉩니다. 컴파일 타임 다형성은 사전 결합이라고도하며, 런타임 다형성을 사후 결합이라고도합니다.
예는 다음과 같습니다.
public class overloadandoverwrite {public static void main (String [] args) {a a1 = new a (); a2 = 새로운 b (); B B = 새로운 B (); C C = 새로운 C (); d d = 새로운 d (); System.out.print ( "a1.print (a1) :"); a1.print (a1); // output a and a system.out.print ( "a1.print (b) :"); a1.print (b); // output a 및 a : 그 이유는 a에 매개 변수 b가있는 메소드가 없으므로 b가 system.out.print ( "a1.print (c) :")이기 때문에 매개 변수 A가있는 메소드가 호출되기 때문입니다. a1.print (c); // output a 및 a : 그 이유는 a에 매개 변수 c가있는 메소드가 없으므로 c가 b에서 상속되기 때문에 매개 변수 a가있는 메소드가 호출되기 때문입니다. a1.print (d); // output a 및 d : 그 이유는 a에 매개 변수 d가있는 메소드가 있기 때문에 매개 변수 d가있는 메소드가 system.out.print ( "a2.print (b) :")로 호출되기 때문입니다. a2.print (b); // 출력 b 및 a : 그 이유는 항목이 A입니다. 첫째, A에 매개 변수 b가있는 인쇄 메소드가 있는지 확인하십시오. 아니요가 없다는 것을 알게되면 A 매개 변수 A가있는 메소드를 찾으십시오. 그런 다음이 메소드가 B에서 다시 작성되었는지 다시 확인하십시오. 다시 쓰기 방법이 있음이 밝혀졌습니다. 다시 쓰기 메소드 System.out.print ( "a2.print (c) :"); A2. 프린트 (C); // output b and a : 그 이유는 항목이 A입니다. 첫째, A에 매개 변수 c가있는 인쇄 메소드가 있는지 확인하십시오. 그렇지 않은 경우, C가 B에서 상속되고 그러한 메소드가 없기 때문에 A에서 인쇄 방법을 찾으려면 B에서 다시 작성된 경우 B에서 다시 작성된 경우 B에서 B에서 B와 같은 인쇄 방법을 찾으십시오. System.out.print ( "a2.print (d) :"); a2.print (d); // 출력 a 및 d : 그 이유는 항목이 A입니다. System.out.print ( "a2.print (a2) :"); A2.print (a2); // 출력 b 및 a; 그 이유는 a2의 유형이 a이기 때문에 a의 매개 변수 A가있는 인쇄 방법이 호출되기 때문입니다. 그러나 A2의 오른쪽에있는 새로운 방법은 b에 매개 변수 a가있는 방법이 있기 때문에 b 의이 방법은 채택된다. B.print (b); // 출력 B 및 B; 이유 : 항목은 B이므로 매개 변수 B가있는 인쇄 기능이 B에 존재하는지 확인하고 직접 출력이 있는지 확인하십시오. System.out.print ( "B.print (c) :"); B.Print (C); // 출력 B 및 B; 이유 : 항목은 B이므로 매개 변수 C가있는 인쇄 함수가 B에 존재하는지 확인하면 존재하지 않는 경우 매개 변수 B가있는 인쇄 기능이 존재하는지 확인합니다. 그것이 존재한다는 것을 발견하고 메소드가 C에 다시 작성되지 않으면 직접 출력합니다. 한 가지 주목할 점은 B가 A에서 상속되기 때문에 매개 변수 C가있는 인쇄 방법이 A에 존재하는지 확인해야한다는 것입니다. 이러한 방식으로 출력 결과는 A 및 C System.out.print ( "B.print (d) :")가됩니다. B.print (d); // 출력 a와 d; 이유 : 항목은 B입니다. B에 매개 변수 d가있는 인쇄 함수가 없지만 B는 A에서 인쇄 함수가있는 인쇄 기능이 있으므로 출력은 A의 매개 변수 d의 결과입니다. }} 클래스 A {public void print (a) {System.out.println ( "a and a"); } public void print (d d) {system.out.println ( "a and d"); } // public void print (c c) // {// system.out.println ( "a and c"); //}} 클래스 B는 {public void print (b b) {System.out.println ( "b and b")을 확장합니다. } public void print (a) {system.out.println ( "b and a"); }} class C 확장 b {} class d는 c {}을 확장합니다.여기에 설명해야 할 것은 다음과 같습니다.
A2 = 새로운 B ();
A2가 별도로 인쇄되면 인쇄 결과는@(HASH 코드) 대신 B@(HASH 코드)이지만 A2의 유형이 A2.print (a2)를 호출 할 때; 위의 프로그램에서, 출력 결과는 B와 A 대신 B이고 A는 A와 A이다 (A2가 B라고 가정하면 클래스 A에 매개 변수 B가있는 인쇄 메소드가 호출되어야한다. 그러한 메소드가 없기 때문에 두 번째 선택은 A의 하위 클래스이기 때문에 A 및 A를 출력 해야하는 메소드를 호출하는 두 번째 선택.
위는 다시 쓰기 및 과부하의 예제 코드 분석입니다. 자바를 공부하는 학생들에게 도움이되기를 바랍니다.