Parent's method2() Parent's method1()
3 Réponses :
Les membres privés ne sont pas hérités par les classes d'enfants. Par conséquent, vous définissez simplement une méthode de vide public entièrement indépendante1 code> dans la sous-classe. Naturellement, il ne participe pas à une expédition dynamique. P>
Cela appellerait la méthode enfant si elle envode la méthode des parents. Mais ce n'est pas le cas, puisque la méthode des parents est privée et qu'elle ne peut donc pas être remplacée. P>
Lorsque votre intention est de remplacer une méthode à partir d'une classe ou d'une interface parent, vous devez toujours annoter la méthode avec Lorsque la classe mère est compilée, le compilateur recherche la méthode1 dans la classe mère. Il le trouve et voit que c'est privé. Puisqu'il est privé, il sait que ce n'est pas remplacé par une sous-classe, et donc statiquement lie la méthode de la méthode à la méthode privée qu'elle a trouvé. P>
Si la méthode1 était protégée ou publique, le compilateur trouverait la méthode et sachez que la méthode pourrait être remplacée par une sous-classe. Donc, cela ne se lierrait pas de manière statique à la méthode. Au lieu de cela, il générerait la bytecode qui rechercherait la méthode1 dans la classe de béton, au moment de l'exécution, et vous auriez alors le comportement que vous attendez. p>
Pensez-y: Si une sous-classe pourrait remplacer une méthode privée, la méthode ne serait plus privée. P> @override code>. Si vous avez fait, dans ce cas, vous obtiendrez une erreur du compilateur, puisque la méthode de l'enfant1 ne remplace aucune méthode. P>
@ankitagahoi Je ne vois pas le point de "mais" dans votre déclaration :)
S'il s'agit d'un objet de classe enfant et de la classe enfant ayant une méthode1, il n'est donc pas cas de prouver. Enfant p = nouvel enfant ();
Maintenant, j'ai créé un enfant dans un package différent et mis à jour1 par défaut dans le parent maintenant toujours la même sortie. Mais selon vous, il se lie à l'heure de la compilation, mais que la valeur par défaut ne doit pas être liée au moment de la compilation, elle devrait être remplacée. Y même sortie?
Les méthodes par défaut ne peuvent pas être remplacées par des classes dans d'autres packages, vous ne remplissez toujours pas la méthode des parents. Ajoutez l'annotation @override et vous obtiendrez un message de compilateur.
Mais à l'heure compilée, comment le compilateur sait que la classe s'étend sur un package différent?
Dans ce cas, au moment de l'exécution, le JVM vérifie si la classe enfant a une méthode qui remplace la méthode des parents et qu'elle n'en trouve pas, il appelle donc la méthode des parents. La méthode de l'enfant a la même signature, mais elle ne remplace pas la classe mère, car elle est dans un package différent.
@JB Le compilateur est toujours celui qui déciderait si une méthode est une substitution ou non. Comment pourrait-il mettre en œuvre @override code>? Dans ce cas particulier, lors de la compilation de la sous-classe, toutes les informations nécessaires pour la conclure sont disponibles pour le compilateur. Exemple: Test de package; test de classe publique {void a () {}} code> test de package2; Classe publique Test2 étend tester.test {@override vide A () {}} code> Erreur: La méthode A () de type test2 doit remplacer ou mettre en place une méthode SuperType code>
@Markotopolnik: Oui, je suis d'accord avec ça. Mais le compilateur génère toujours une invocation de méthode virtuelle lors de la compilation de la classe mère. Et au moment de l'exécution, la JVM est toujours de dynamisme de manière dynamique à la méthode appropriée1 Mise en œuvre, qui est le parent unique, car le compilateur a établi que la méthode enfant ne l'a pas remplacé, car pas dans le même paquet.
Oui, peut-être que c'est de beaux détails, mais l'exécution ne prend même pas la méthode de la sous-classe en considération. La table de fonction virtuelle de la sous-classe indique le front à l'avant qu'il ne remplace pas la méthode.
Par défaut, la classe enfant aura accès à la méthode des parents. Vous appelez p.method2 () ... qui n'existe pas dans la classe enfant, de sorte qu'il exécute du parent ... p>
Méthode1 () est privé est parent. C'est appelé de la méthode locale I.e. Méthode2 () ... SO METHODY1 () a une accessibilité dans la méthode2 () .... P>