Primordial protégé méthodes en Java
Test.java
package a;
import b.B;
public class Test {
public static void main(String[] v) {
new A().test();
new B().test();
}
}
A.java:
package a;
public class A {
protected void test() { }
}
B.java:
package b;
public class B extends a.A {
protected void test() { }
}
Pourquoi ne new B().test()
donner une erreur? N'est-ce pas briser les règles de visibilité?
B.test()
est invisible dans Test
parce qu'ils sont dans les packages différents, et pourtant, il refuse d'appeler le test()
dans B
'super-classe qui est visible.
Des liens vers la partie appropriée de la JLS serait appréciée.
"donner une erreur" .. Pouvez-vous être plus précis?
il demande pourquoi il ne peut pas appeler une méthode qu'il a accès à la méthode super.
il refuse de compiler: "un/Test.java:10: test() a un accès protégé dans b.B"
Lisez la question: "n'est-ce pas briser les règles de visibilité?"
l'erreur est (dans ce cas) assez évident: c'est une erreur de compilation disant
il demande pourquoi il ne peut pas appeler une méthode qu'il a accès à la méthode super.
il refuse de compiler: "un/Test.java:10: test() a un accès protégé dans b.B"
Lisez la question: "n'est-ce pas briser les règles de visibilité?"
l'erreur est (dans ce cas) assez évident: c'est une erreur de compilation disant
B().test()
n'est pas visible pour a.Test.main(String[])
.OriginalL'auteur CromTheDestroyer | 2011-04-12
Vous devez vous connecter pour publier un commentaire.
Ici, vous allez JLS sur
protected
mot-clé:JLS protégé description et JLS protégé exemple.
Fondamentalement un
protected
modificateur signifie que vous pouvez accéder champ /méthode /... 1) dans une sous-classe de la classe donnée et 2) à partir des classes du même package.Raison de 2)
new A().test()
œuvres. Maisnew B().test()
ne fonctionne pas, parce que la classeB
est dans le package différent.OriginalL'auteur pajton
Le problème est qu'au moment de la compilation en vous disant Java que vous souhaitez accéder à un membre protégé d'une classe lorsque vous ne disposez pas d'un tel accès.
Si vous avez fait ceci au lieu de cela;
Alors il serait le travail et la méthode de remplacement sera exécuté, car au moment de la compilation Java vérifie que vous avez accès à A. Au moment de l'exécution de l'objet fourni est la méthode appropriée de sorte que le B méthode test() s'exécute. Dynamique de la liaison ou une liaison tardive est la clé.
OriginalL'auteur Vincent Ramdhanie
Ce n'est tout simplement pas la façon dont l'héritage fonctionne en Java.
Si une méthode est substituée, et la méthode de remplacement n'est pas visible, c'est une erreur de compilation pour essayer de l'appeler.
Vous semblent attendre que Java serait de revenir automatiquement à la méthode de la super-classe, mais cela ne se produise pas.
Je vais essayer de creuser la JLS plus tard pourquoi ce n'est pas fait...
OriginalL'auteur sleske
Oui, la substitution de la méthode protégée est possible.
De Sortie: B
OriginalL'auteur Manas