méthode privée dans l'héritage en Java
J'ai la confusion sur l'utilisation de méthodes privées en matière d'héritage, par exemple:
public class A {
private void say(int number){
System.out.print("A:"+number);
}
}
public class B extends A{
public void say(int number){
System.out.print("Over:"+number);
}
}
public class Tester {
public static void main(String[] args) {
A a=new B();
a.say(12);
}
}
Basées sur les codes ci-dessus, je suis confus au sujet de l'héritage de la méthode privée, est la méthode privée hérité de class A
à B
? Ou le dire de méthodes dans les deux classes sont totalement étrangers? Comme le code d'erreur lorsqu'il est en cours d'exécution dans la méthode main (), il semble que class B
ne peut invoquer la méthode privée de class A
.
Vous ne pouvez pas remplacer les méthodes privées.
protégé méthodes sont héritées. les méthodes privées ne sont pas héritées.
protégé méthodes sont héritées. les méthodes privées ne sont pas héritées.
A
ne pas avoir un public say()
méthode, par conséquent, ce programme ne devrait pas compiler. Si vous forcer avec ((B)a).say(12)
alors il le fera.OriginalL'auteur pei wang | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Si vous voulez une sous-classe d'avoir accès à une super-classe de la méthode qui doit rester
private
, puisprotected
est le mot clé que vous recherchez.Private
permet seulement la classe contenant le membre pour accéder à cettemembre.
Protected
permet au membre d'accéder à la classe ettous ses sous-classes.
Public
permet à quiconque d'accéder au membre.Si vous avez un
private
membre qui a unprotected
oupublic
de lecture, la lecture peut être utilisé pour accéder à laprivate
méthode. Pourquoi? Parce que la lecture aprotected
oupublic
visibilité.Mais pour les codes ci-dessus, je ne pouvais pas générer les méthodes Getter et Setter pour la classe A, comme il n'existe aucune instance privée
Généralement,
getter
etsetter
se réfère à des méthodes publiques qui permettent d'accéder aux variables privées. Dans ce cas, vous avez unprivate
méthode. Si vous voulez appeler cette méthode, il y a deux choses que vous pouvez faire. Vous pouvez modifier la méthode de la visibilité àprotected
oupublic
, ou vous pouvez faire quelque chose de similaire à ungetter
, comme ceci:public void getSayMethod(int someNum) { say(someNum); }
Il ne fait aucun sens pour moi... mais vous pourriez le faire.Salut nhgrif, à l'aide de la méthode de lecture, j'ai essayé A. a=new A(); A. a=new B(); ils sont tous deux tirages,Un:12. Signifie-t-il de n'importe quel objet que j'utilise (nouvelle ou nouveau B), il imprime toujours la même chose
OriginalL'auteur nhgrif
La raison pour laquelle vous obtenez l'erreur est parce que
say(int)
est privé. Cela n'a rien à voir avec l'héritage. Vous pouvez uniquement appeler une méthode dans sa définition de la classe.Pour répondre à votre question de l'héritage,
B.say()
est un différents méthode, il n'est pas même méthode de remplacementA.say()
parce que les classes dérivées peuvent pas hériter des méthodes privées de sa classe de base. Seulementprotected
etpublic
méthodes/variables peut être héréditaire et/ou remplacées.Les sous-classes peuvent accéder à
protected
etpublic
membres. Vous pouvez faire unprivate
variable avec unpublic
ouprotected
setter et getter qui les sous-classes peuvent utiliser pour accéder à laprivate
variable.Si ils sont privés de méthodes et cas, il ne devrait pas être une raison pour appeler cette méthode à l'extérieur de sa classe. Essayer de le faire il est odeur de code. Mais ceci dit, vous pouvez toujours créé public getter et setter dans la classe de base pour appeler la méthode privée.. mais alors il ya une raison pourquoi l'encapsulation a été inventé.
OriginalL'auteur Lews Therin
Privé signifie que vous ne pouvez y accéder que dans la classe d'un pas ailleurs.
OriginalL'auteur Ducksauce88
Sous-classes ne peuvent invoquer ou de remplacer
protected
oupublic
méthodes (méthodes ou sans modificateurs d'accès, si la classe mère est dans le même package) à partir de leurs super-classes.private
méthodes rester dans la classe dans laquelle elles sont déclarées et ne sont pas visibles pour toute autre classe, peu importe comment il est lié.OriginalL'auteur Josh
Il y a deux choses qui se passent ici.
Tout d'abord, gardez à l'esprit la distinction entre le type de la référence et le type de l'objet.
Quand vous dites
A A = new B();
la référence est
a
de typeA
, mais l'objet est de typeB
. Ainsi, lorsque vous appeleza.say(12);
, vous êtes à la recherche àB
de laA
API/interface/perspective.Seconde, parce que vous êtes à la recherche à
B
de laA
point de vue, vous allez obtenir une erreur carA
a pas de méthode appeléesay()
. Bien sûrB
n', mais rappelez-vous que vous traitezB
comme unA
. Lorsque vous faites cela, vous perdez la capacité (à moins que vous lancez plus tard, mais ne vous inquiétez pas à ce sujet pour l'instant) pour faire référence à cesB
méthodesA
ne le sait pas.En fin de compte,
B
fait jamais héritesay()
deA
car il ne peut le voir dans la première place, etA
a pas de méthode publiquesay()
pour quiconque de l'accès.Maintenant, si vous voulez vraiment vous amuser, faire
say()
protégé dansA
et privés dans leB
et voir ce qui se passe.OriginalL'auteur Vidya