>Java >java지도 시간 >하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유는 무엇입니까?

하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유는 무엇입니까?

WBOY
WBOY원래의
2024-03-08 16:48:04534검색

하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유는 무엇입니까?

하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유는 무엇입니까?

객체 지향 프로그래밍에서 오버로딩은 동일한 클래스에 여러 메서드를 정의하는 것을 의미합니다. 이러한 메서드는 이름은 같지만 매개변수 목록이 달라서 서로 다른 기능 구현을 달성합니다. 하위 클래스가 상위 클래스로부터 상속받을 때 하위 클래스에 동일한 이름을 가진 메서드의 오버로드가 있으면 예외가 발생할 수 있습니다.

하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유를 더 구체적으로 설명하려면 다음 코드 예제를 살펴보겠습니다.

class Parent {
    void display() {
        System.out.println("Parent class display method");
    }
    void display(int num) {
        System.out.println("Parent class display method with parameter");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("Child class display method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parent = new Child();
        parent.display();
        parent.display(10);
    }
}

위 코드에서는 상위 클래스 Parent를 정의하고 하위 클래스 Child. 상위 클래스에는 두 개의 오버로드된 display 메서드가 있습니다. 즉, 매개 변수가 없는 버전과 정수 매개 변수가 있는 버전입니다. 하위 클래스 Child는 상위 클래스 Parent에서 상속되며 상위 클래스의 display 메서드를 재정의합니다. Parent 和一个子类 Child,父类中有两个重载的 display 方法,分别是没有参数的版本和带一个整型参数的版本。子类 Child 继承自父类 Parent,并且重写了父类中的 display 方法。

Main 类中,我们创建了一个父类的引用指向子类的对象。然后尝试分别调用 display 方法和 display(int num) 方法。根据多态的原则,由于引用变量是父类类型,实际对象是子类类型,所以调用的应该是子类 Child 中的方法。

然而,当运行程序时,会发现只有 display 方法被调用,而调用 display(int num) 方法时会产生编译错误。这是因为在继承关系中,子类重载父类的方法,并不会覆盖父类的方法,而只是新增了一个重载的方法。因此,当通过父类引用调用重载方法时,编译器会选择调用父类中定义的方法,而不是子类中重载的方法。

为了解决这个问题,我们可以通过将父类中的方法声明为 final

Main 클래스에서는 상위 클래스에서 하위 클래스의 객체에 대한 참조를 만듭니다. 그런 다음 display 메서드와 display(int num) 메서드를 각각 호출해 보세요. 다형성의 원리에 따라 참조변수는 상위 클래스 유형이고 실제 객체는 하위 클래스 유형이므로 하위 클래스 Child의 메서드를 호출해야 합니다.

그러나 프로그램을 실행해보면 display 메서드만 호출되는 것을 볼 수 있으며, display(int num) 메서드를 호출하면 컴파일 오류가 발생합니다. 상속 관계에서 하위 클래스가 상위 클래스의 메서드를 재정의하면 상위 클래스의 메서드를 덮어쓰지 않고 오버로드된 새 메서드만 추가하기 때문입니다. 따라서 오버로드된 메서드가 부모 클래스 참조를 통해 호출되면 컴파일러는 자식 클래스의 오버로드된 메서드 대신 부모 클래스에 정의된 메서드를 호출하도록 선택합니다. 🎜🎜이 문제를 해결하기 위해 상위 클래스의 메서드를 final으로 선언하거나 하위 클래스의 상위 클래스에 있는 모든 메서드를 오버로드하여 하위 클래스의 메서드를 메서드라고 부르도록 할 수 있습니다. 예외를 발생시키지 않고. 🎜🎜결론적으로, 상속 관계에서 상위 클래스의 메소드를 오버로드하는 하위 클래스는 상위 클래스의 메소드를 오버라이드하지 않기 때문에 하위 클래스가 오버로드된 메소드를 호출하면 예외가 발생하므로 사용할 때 이를 방지하기 위해 주의해야 합니다. 상황이 발생합니다. 🎜

위 내용은 하위 클래스가 오버로드된 메서드를 호출할 때 예외가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.