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 ?

Mar 08, 2024 pm 04:48 PM
重载 继承 调用 编译错误

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);
    }
}
Copier après la connexion

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Explication détaillée de l'héritage des fonctions C++ : Comment utiliser le « pointeur de classe de base » et le « pointeur de classe dérivé » dans l'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment utiliser le « pointeur de classe de base » et le « pointeur de classe dérivé » dans l'héritage ? May 01, 2024 pm 10:27 PM

Dans l'héritage de fonction, utilisez le « pointeur de classe de base » et le « pointeur de classe dérivée » pour comprendre le mécanisme d'héritage : lorsque le pointeur de classe de base pointe vers l'objet de classe dérivé, une transformation ascendante est effectuée et seuls les membres de la classe de base sont accessibles. Lorsqu’un pointeur de classe dérivée pointe vers un objet de classe de base, une conversion vers le bas est effectuée (dangereuse) et doit être utilisée avec prudence.

Que signifie val en Java Que signifie val en Java Apr 25, 2024 pm 10:06 PM

Le mot-clé val en Java est utilisé pour déclarer une variable locale immuable, c'est-à-dire que sa valeur ne peut pas être modifiée une fois attribuée. Les fonctionnalités sont les suivantes : Immuabilité : Une fois initialisée, la variable val ne peut pas être réaffectée. Portée locale : les variables val ne sont visibles que dans le bloc de code dans lequel elles sont déclarées. Inférence de type : le compilateur Java déduira le type de la variable val en fonction de l'expression affectée. Variables locales uniquement : val ne peut être utilisé que pour déclarer des variables locales, pas des champs de classe ou des paramètres de méthode.

La différence entre const et statique en C++ La différence entre const et statique en C++ May 01, 2024 am 10:54 AM

Le modificateur const indique une constante et la valeur ne peut pas être modifiée ; le modificateur static indique la durée de vie et la portée de la variable. Les données membres modifiées par const ne peuvent pas être modifiées après l'initialisation. Les variables modifiées par static sont initialisées au démarrage du programme et détruites à la fin du programme. Elles existeront même s'il n'y a pas d'objet actif et sont accessibles à travers les fonctions. Les variables locales modifiées par const doivent être initialisées lors de leur déclaration, tandis que les variables locales modifiées par static peuvent être initialisées ultérieurement. Les variables membres de classe modifiées par Const doivent être initialisées dans le constructeur ou la liste d'initialisation, tandis que les variables membres de classe modifiées statiquement peuvent être initialisées en dehors de la classe.

Que signifie = en Java Que signifie = en Java Apr 26, 2024 pm 11:30 PM

L'opérateur "=" dans le langage de programmation Java est utilisé pour attribuer une valeur à une variable, en stockant la valeur à droite de l'expression dans la variable de gauche. Utilisation : variable = expression, où variable est le nom de la variable qui reçoit l'affectation et expression est le segment de code qui calcule ou renvoie la valeur.

Comment l'héritage et le polymorphisme affectent-ils le couplage de classes en C++ ? Comment l'héritage et le polymorphisme affectent-ils le couplage de classes en C++ ? Jun 05, 2024 pm 02:33 PM

L'héritage et le polymorphisme affectent le couplage des classes : l'héritage augmente le couplage car la classe dérivée dépend de la classe de base. Le polymorphisme réduit le couplage car les objets peuvent répondre aux messages de manière cohérente via des fonctions virtuelles et des pointeurs de classe de base. Les meilleures pratiques incluent l'utilisation de l'héritage avec parcimonie, la définition d'interfaces publiques, l'évitement de l'ajout de données membres aux classes de base et le découplage des classes via l'injection de dépendances. Un exemple pratique montrant comment utiliser le polymorphisme et l'injection de dépendances pour réduire le couplage dans une application de compte bancaire.

Explication détaillée de l'héritage des fonctions C++ : Comment déboguer les erreurs d'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment déboguer les erreurs d'héritage ? May 02, 2024 am 09:54 AM

Conseils de débogage des erreurs d’héritage : assurez-vous que les relations d’héritage sont correctes. Utilisez le débogueur pour parcourir le code et examiner les valeurs des variables. Assurez-vous d'utiliser correctement le modificateur virtuel. Examinez le problème des diamants d'héritage causé par l'héritage caché. Recherchez les fonctions virtuelles pures non implémentées dans les classes abstraites.

Explication détaillée de l'héritage des fonctions C++ : Comment comprendre la relation « est-un » et « a-un » dans l'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment comprendre la relation « est-un » et « a-un » dans l'héritage ? May 02, 2024 am 08:18 AM

Explication détaillée de l'héritage de fonction C++ : Maîtriser la relation entre "is-a" et "has-a" Qu'est-ce que l'héritage de fonction ? L'héritage de fonction est une technique en C++ qui associe des méthodes définies dans une classe dérivée à des méthodes définies dans une classe de base. Il permet aux classes dérivées d'accéder et de remplacer les méthodes de la classe de base, étendant ainsi les fonctionnalités de la classe de base. Relations « est-un » et « a-un » Dans l'héritage de fonctions, la relation « est-un » signifie que la classe dérivée est un sous-type de la classe de base, c'est-à-dire que la classe dérivée « hérite » des caractéristiques et du comportement de la classe de base. La relation « possède un » signifie que la classe dérivée contient une référence ou un pointeur vers l'objet de classe de base, c'est-à-dire que la classe dérivée « possède » l'objet de classe de base. SyntaxeVoici la syntaxe permettant d'implémenter l'héritage de fonction : classDerivedClass:pu

Comment le compilateur différencie-t-il les paramètres ayant le même style mais des types différents dans le mécanisme de surcharge de fonctions de Java ? Comment le compilateur différencie-t-il les paramètres ayant le même style mais des types différents dans le mécanisme de surcharge de fonctions de Java ? Apr 25, 2024 am 10:03 AM

La façon dont le compilateur différencie les fonctions surchargées : par leur signature, qui est le type de chaque paramètre de fonction. Même si le nom de la fonction et le nombre de paramètres sont identiques, le compilateur peut les distinguer tant que les types de paramètres sont différents.

See all articles