Maison >Java >javaDidacticiel >Pourquoi une exception se produit-elle lorsqu'une sous-classe appelle une méthode surchargée ?

Pourquoi une exception se produit-elle lorsqu'une sous-classe appelle une méthode surchargée ?

WBOY
WBOYoriginal
2024-03-08 16:48:04540parcourir

Pourquoi une exception se produit-elle lorsquune sous-classe appelle une méthode surchargée ?

Pourquoi une exception se produit-elle lorsqu'une sous-classe appelle une méthode surchargée ?

En programmation orientée objet, la surcharge fait référence à la définition de plusieurs méthodes dans la même classe. Ces méthodes ont le même nom mais des listes de paramètres différentes pour réaliser différentes implémentations fonctionnelles. Lorsqu'une sous-classe hérite d'une classe parent, s'il y a une surcharge d'une méthode du même nom dans la sous-classe, des exceptions peuvent survenir.

Pour expliquer plus précisément pourquoi une exception est levée lorsqu'une sous-classe appelle une méthode surchargée, regardons l'exemple de code suivant :

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);
    }
}

Dans le code ci-dessus, nous définissons une classe parent Parent Et un sous-classe Child. Il existe deux méthodes display surchargées dans la classe parent, à savoir la version sans paramètres et la version avec un paramètre entier. La sous-classe Child hérite de la classe parent Parent et remplace la méthode display dans la classe parent. Parent 和一个子类 Child,父类中有两个重载的 display 方法,分别是没有参数的版本和带一个整型参数的版本。子类 Child 继承自父类 Parent,并且重写了父类中的 display 方法。

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

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

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

Dans la classe Main, nous créons une référence de la classe parent vers l'objet de la sous-classe. Essayez ensuite d'appeler respectivement la méthode display et la méthode display(int num). Selon le principe du polymorphisme, puisque la variable de référence est du type classe parent et que l'objet réel est du type sous-classe, la méthode de la sous-classe Child doit être appelée.

Cependant, lorsque vous exécutez le programme, vous constaterez que seule la méthode display est appelée, et l'appel de la méthode display(int num) générera une erreur de compilation. En effet, dans la relation d'héritage, lorsqu'une sous-classe remplace la méthode de la classe parent, elle n'écrase pas la méthode de la classe parent, mais ajoute uniquement une nouvelle méthode surchargée. Par conséquent, lorsqu'une méthode surchargée est appelée via une référence de classe parent, le compilateur choisira d'appeler la méthode définie dans la classe parent plutôt que la méthode surchargée dans la classe enfant. 🎜🎜Afin de résoudre ce problème, nous pouvons déclarer les méthodes de la classe parent comme final, ou surcharger toutes les méthodes de la classe parent dans la sous-classe pour garantir que les méthodes de la sous-classe sont appelées méthode sans lever d'exception. 🎜🎜Pour résumer, des exceptions seront levées lorsque les sous-classes appellent des méthodes surchargées car dans la relation d'héritage, les sous-classes surchargeant les méthodes de la classe parent ne remplaceront pas les méthodes de la classe parent, vous devez donc faire attention pour éviter cela lors de l'utilisation la situation se présente. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn