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);
    }
}
Était-ce utile?

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 constructeur Bloo est une erreur. Le compilateur ne trouve pas le constructeur sans paramètre Blah car vous en avez défini un avec un paramètre String.
  • L'appel de new Blah () dans TestBlah la méthode main 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 variable testing pour une classe.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top