Java의 다형성은 컴파일 타임 다형성(오버로딩)과 런타임 다형성(재작성)의 두 가지 유형으로 구분됩니다. 컴파일 타임 다형성은 프론트 바인딩이라고도 하며, 런타임 다형성은 포스트 바인딩이라고도 합니다.
다음은 예입니다.
public class OverloadAndOverwrite { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.print("a1.print(a1): "); a1.print(a1);//输出A and A System.out.print("a1.print(b): "); a1.print(b);//输出A and A:原因是因为A中不存在参数为B的方法,因此会调用参数为A的方法,因为B是继承自A的 System.out.print("a1.print(c): "); a1.print(c);//输出A and A:原因是因为A中不存在参数为C的方法,因此会调用参数为A的方法,因为C是继承自B的,B是继承自A的 System.out.print("a1.print(d): "); a1.print(d);//输出A and D:原因是因为A中存在参数为D的方法,因此会调用参数为D的方法 System.out.print("a2.print(b): "); a2.print(b);//输出B and A:原因在于首先入口是A,首先查看A中是否有参数为B的print方法,发现没有那就寻找有没有参数为A的方法,因为B是继承自A的,发现存在这样的方法,那么再次查看B中有没有重写这个方法,发现有重新,直接调用B中这个重写的方法 System.out.print("a2.print(c): "); a2.print(c);//输出B and A:原因在于首先入口是A,首先查看A中是否有参数为C的print方法,发现没有那就寻找有没有参数为B的方法,因为C是继承自B的,发现也不存在这样的方法,那就寻找存在参数为A的print方法,因为B继承自A,发现存在这样的方法,那么再次查看B中有没有重写这个方法,发现有重新,直接调用B中这个重写的方法 System.out.print("a2.print(d): "); a2.print(d);//输出 A and D:原因在于入口是A,查看A中存在参数为D的方法,再次查看B中没有重写这个方法,因此输出A中这个方法的结果即可; System.out.print("a2.print(a2): "); a2.print(a2);//输出B and A;原因在于a2的类型是A,因此会调用A里面参数为A的print方法,但是a2右边new的是B,所以因为B中有参数为A的方法,因此采用的是B里面的这个方法 System.out.print("b.print(b): "); b.print(b);//输出B and B;原因:入口是B,因此查看B中存不存在参数为B的print函数,存在则直接输出; System.out.print("b.print(c): "); b.print(c);//输出B and B;原因:入口是B,因此查看B中存不存在参数为C的print函数,发现不存在,则查看存不存在参数为B的print函数,发现存在,并且C中并没有重写该方法,则直接输出;有一点需要注意的是还需要查看一下A中是否存在参数为C的print方法,因为B继承自A,有的话会及成果来这个方法,这样的话输出的结果将变为A and C System.out.print("b.print(d): "); b.print(d);//输出A and D;原因:入口是B,虽然B中不存在参数为D的print函数,但是B继承自A,A中是存在参数为D的print函数的,因此输出的是A中参数为D的结果; } } class A { public void print(A 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"); // } } class B extends A { public void print(B b) { System.out.println("B and B"); } public void print(A a) { System.out.println("B and A"); } } class C extends B{} class D extends C{}
여기서 설명해야 할 내용은 다음과 같습니다.
For A a2 = new B( );
인쇄된 경우 별도로 a2가 출력되면 인쇄된 결과는 A@(해시 코드)가 아닌 B@(해시 코드)이지만 이는 a2의 유형이 B 유형이라는 의미는 아닙니다. 위 프로그램; 출력 결과가 A와 A 대신 B와 A인 경우(a2가 B 유형이라고 가정하면 클래스 A에서 매개변수 B를 사용하여 인쇄 메소드를 호출해야 합니다. 그런 메소드가 없기 때문입니다. 두 번째로 좋은 옵션은 B가 A의 하위 클래스이기 때문에 매개 변수 A가 있는 메서드를 호출하여 A와 A를 출력해야 합니다.
위 내용은 Rewriting과 Overloading에 대한 코드 분석 예시입니다. Java를 배우는 학생들에게 도움이 되었으면 좋겠습니다.
Java 함수 오버로딩 및 예제 코드 다시 작성과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!