L'accès protégé par Java ne fonctionne pas
-
22-07-2019 - |
Question
En Java, il existe trois niveaux d'accès:
- Public - Ouvert sur le monde
- Private - Ouvert uniquement à la classe
- Protected - Ouvert uniquement à la classe et à ses sous-classes (héritage).
Alors, pourquoi le compilateur Java permet-il que cela se produise?
TestBlah.java:
public class TestBlah {
public static void main(String[] args) {
Blah a = new Blah("Blah");
Bloo b = new Bloo("Bloo");
System.out.println(a.getMessage());
System.out.println(b.getMessage()); //Works
System.out.println(a.testing);
System.out.println(b.testing); //Works
}
}
Blah.java:
public class Blah {
protected String message;
public Blah(String msg) {
this.message = msg;
}
protected String getMessage(){
return(this.message);
}
}
Bloo.java:
public class Bloo extends Blah {
public Bloo(String testing) {
super(testing);
}
}
La solution
En fait, cela devrait être:
Ouvert uniquement aux classes du même package la classe et ses sous-classes (héritage)
C'est pourquoi
Autres conseils
Parce que protégé signifie sous-classe ou d'autres classes du même package.
Et il existe en fait un quatrième " défaut " niveau d'accès, lorsque le modificateur est omis, ce qui donne accès à d'autres classes du même package.
Ainsi, protected
se situe entre l'accès par défaut et public
.
Pour être plus précis, vous vous attendez à ce que protected
fonctionne comme en C ++.
Cependant, en Java, cela a un sens différent. En Java, une méthode protégée est disponible pour la classe (évidemment), toutes les autres classes du même package et toutes les sous-classes de cette classe. Les classes d'autres packages n'auront pas accès à moins de sous-classer cette classe d'origine.
Voir cette question similaire pour des informations plus spécifiques sur les marqueurs d'héritage.
Personnellement, je n’utilise presque jamais protected
. Je développe des applications plutôt que des frameworks donc je suis beaucoup plus susceptible de définir des méthodes public
, des données privées
et, assez souvent, de marquer toute ma classe comme final
.
Il existe actuellement quatre niveaux d’accès: "public", "protégé", "privé". & amp; défaut également connu comme paquet privé ou paquet protégé. La valeur par défaut limite l'accessibilité au package. La valeur par défaut est très utile et je l’utilise fréquemment.
Vous pouvez appeler b.getMessage ()
car b
est de type Bloo
, ce qui étend Blah
et getMessage ()
est protégé. Protégé, comme vous l'avez mentionné, permet aux sous-classes d'accéder à la méthode.
Vous avez cependant les erreurs suivantes:
- L'appel de
super ()
sans argument dans le constructeurBloo
est une erreur. Le compilateur ne trouve pas le constructeur sans paramètreBlah
car vous en avez défini un avec un paramètre String. - L'appel de
new Blah ()
dansTestBlah
la méthodemain
est une erreur pour la même raison que ci-dessus. - La référence à
a.testing
et àb.testing
est une erreur car vous n'avez pas défini la variabletesting
pour une classe.