11
votes

Méthodes privées dans l'héritage

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

}


1 commentaires

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


9 Réponses :


15
votes

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.


2 commentaires

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.



3
votes

Lorsque vous avez utilisé cette ligne:

((Subclass)obj).doSomething(); #prints "from Subclass"


1 commentaires

Compte tenu du code OP, ((sous-classe) obj) .Dosomething (); #prints "de la sous-classe" ne compilera pas, car vous accédez à une méthode privée en dehors de sa classe Sous-classe .



18
votes

Les méthodes privées ne sont que pour le propriétaire.

Pas même pour les enfants, les parents ou les amis du propriétaire.


0 commentaires

5
votes

Ça fonctionne parce que vous moulez à un Superclass à partir d'une méthode de Superclass . Dans ce contexte, superclass.Dosomething est disponible pour le compilateur.

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


0 commentaires

5
votes
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.

0 commentaires

3
votes

Depuis le type de référence de l'objet obj est Superclass , un appel à DOSOMOD () essaie d'accéder à la méthode privée définie dans < Code> Superclass elle-même (les méthodes privées ne peuvent pas être remplacées). AS Dosomething () est accessible dans Superclass , la méthode principale peut appeler dosomething () sans donner d'erreur / s.

J'espère que cela vous aidera! : -)


0 commentaires

-1
votes

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.

É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:

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

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.


0 commentaires

0
votes

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.

Par exemple: xxx

similaire quand il n'y a pas de héritage variable de référence, super classe va être considérée.


2 commentaires

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.



1
votes

Pourquoi il est possible d'invoquer dansomething () en premier lieu?

Pourquoi pas? obj est une instance de sous-classe et Superclass , et comme dosomething () est déclaré dans Superclass et obj est utilisé, vous avez donc accès à superclass.Dosomething () , vous pouvez essayer de renommer votre méthode (à par exemple : DOINOTTHERTHINTE () ) Et vous aurez toujours accès à celui-ci.

Comment Obj a-t-il accès à un membre privé de son parent?

Il n'y a pas de parent / enfant pour une méthode privée et comme obj est également un type de Superclass , il a donc accès à toutes les méthodes / champs privés déclarés dans C'est parce que obj est utilisé dans cette classe. Vous perdrez ce privilège d'accès si vous êtes en dehors de Superclass ou d'une classe qui a Superclass en tant que membre (classe imbriquée).

alors quoi?

Il n'y a pas de relation / héritage entre les méthodes privées SUPERCLASS Sous-classe S sous-classe SUPLACES ILS ont le même nom et la même signature, de Spécification de la langue Java, Java Se 8 édition :

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.


0 commentaires