Voici un extrait de code intéressant:
public class Superclass { public static void main (String[] args){ Superclass obj = new Subclass(); obj.doSomething(); #prints "from Superclass" } private void doSomething(){System.out.println("from Superclass");} } class Subclass extends Superclass { private void doSomething(){System.out.println("from Subclass");} }
9 Réponses :
Vous avez répondu vous-même. Comme les méthodes privées ne sont pas héritées, une référence de superclasse appelle sa propre méthode privée. P>
Si, par "référence", vous voulez dire l'instance de la sous-classe référencée par le pointeur stocké dans la variable Obj, c'est une réponse circulaire. Cette instance est toujours de la sous-classe de type, et il ne devrait pas avoir accès au membre privé du parent.
Le point est que vous l'attribuez à une référence de superclasse. Et avec cette méthode étant privée, cela ne sera pas remplacé par la mise en œuvre de la sous-classe. Cette référence ne connaît qu'une seule méthode dosomique, qui est dans la superclasse.
Lorsque vous avez utilisé cette ligne:
((Subclass)obj).doSomething(); #prints "from Subclass"
Compte tenu du code OP, ((sous-classe) obj) .Dosomething (); #prints "de la sous-classe" code> ne compilera pas, car vous accédez à une méthode privée B> en dehors de sa classe
Sous-classe code>.
Les méthodes privées ne sont que pour le propriétaire. P>
Pas même pour les enfants, les parents ou les amis du propriétaire. P>
Ça fonctionne parce que vous moulez à un Si vous deviez modifier votre Super et vos sous-classes à deux classes arbitraires différentes A et B, non liées à la classe contenant la méthode code> code> Essayez le même code, le compilateur se plaint de ne pas avoir accès à la méthode. P> Superclass code> à partir d'une méthode de
Superclass code>. Dans ce contexte,
superclass.Dosomething code> est disponible pour le compilateur. P>
Superclass obj = new Subclass(); At this point, obj is both things, a Subclass, and a Superclass object. The fact that you use Superclass in the declaration of the variable is just a matter of casting it.When you do: obj.doSomething(), you are telling the compiler to call the private method doSomething() of obj. Because you are doing it from the main static method inside Superclass, the compiler can call it. If you would use the main method of Subclass rather than the one in Superclass, you would not be able to access that method because, as you said, it's neither inherited nor a part of your definition of Subclass.So basically you understood inheritance correctly. The problem was related to the visibility of private methods.
Depuis le type de référence de l'objet J'espère que cela vous aidera! : -) p> obj code> est
Superclass code>, un appel à
DOSOMOD () code> essaie d'accéder à la méthode privée définie dans < Code> Superclass code> elle-même (les méthodes privées ne peuvent pas être remplacées).
AS
Dosomething () Code> est accessible dans
Superclass code>, la méthode
principale code> peut appeler
dosomething () code> sans donner d'erreur / s. p>
Lorsque nous définissons une méthode privée avec le même nom dans la classe dérivée, il devient une nouvelle méthode que la classe dérivée n'hérite pas aux membres privés. p>
Étant donné que la méthode privée n'est même pas visible en dehors de la classe, nous ne pouvons jamais appeler une méthode privée de classe de base à partir d'une classe dérivée, elle lancera une erreur de compilation: p>
Exception dans le fil "Main" Java.Lang.Error: Problème de compilation non résolu: La méthode AprivateMethod () de la base de type n'est pas visible p>
Nous pouvons utiliser la mise en phase descendante vers la référence de la classe mère pour appeler la méthode privée de la classe dérivée, qui ne peut être accédée que dans cette classe dérivée. p>
Pour comprendre cette question, vous pouvez relier la méthode privée à la variable de membre de la classe super classe et de la classe.
Nous savons donc que la variable membre ne sera pas remplacée dans la sous-classe. P>
Par exemple: p> similaire quand il n'y a pas de héritage variable de référence, super classe va être considérée. p> p>
Qu'essayez-vous d'illustrer en montrant les deux dernières lignes de code? Ne sont-ils pas identiques aux lignes directement précédentes?
Oui, ils sont identiques..juste j'ai donné deux sous-classes au lieu d'un ... Je pense que cela devrait aller bien.
Pourquoi il est possible d'invoquer dansomething () en premier lieu? p> blockQuote>
Pourquoi pas?
obj code> est une instance de
sous-classe code> et
Superclass code>, et comme
dosomething () code> est déclaré dans
Superclass code> et
obj code> est utilisé, vous avez donc accès à
superclass.Dosomething () code>, vous pouvez essayer de renommer votre méthode (à
par exemple strong>: DOINOTTHERTHINTE () CODE>) Et vous aurez toujours accès à celui-ci. P>
Comment Obj a-t-il accès à un membre privé de son parent? p> blockQuote>
Il n'y a pas de parent / enfant pour une méthode privée et comme
obj code> est également un type de
Superclass code>, il a donc accès à toutes les méthodes / champs privés déclarés dans C'est parce que
obj code> est utilisé dans cette classe. Vous perdrez ce privilège d'accès si vous êtes en dehors de
Superclass code> ou d'une classe qui a
Superclass code> en tant que membre (classe imbriquée). P>
alors quoi? strong> p>
Il n'y a pas de relation / héritage entre les méthodes privées code> SUPERCLASS code> Sous-classe CODE> S sous-classe CODE> SUPLACES CODE> ILS ont le même nom et la même signature, de Spécification de la langue Java, Java Se 8 édition A>: p>
une méthode privée et toutes les méthodes déclarées immédiatement dans une finale classe (§8.1.1.2) se comporter comme s'ils sont finaux, puisqu'il est impossible pour les remplacer. p> blockQuote>
Il serait intéressant de voir ce qui se passe lorsque la méthode de l'enfant est publique. Je l'ai fait, dit-il: "de la superclasse" intéressant, il ne le remplace pas