Domanda

In Java, ci sono tre livelli di accesso:

  • Pubblico: aperto al mondo
  • Privato: aperto solo alla classe
  • Protetto: aperto solo alla classe e alle sue sottoclassi (eredità).

Quindi, perché il compilatore Java consente che ciò accada?

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);
    }
}
È stato utile?

Soluzione

In realtà dovrebbe essere:

  

Aperto solo alle sullo stesso pacchetto la classe e le sue sottoclassi (eredità)

Ecco perché

Altri suggerimenti

Perché protetto significa sottoclasse o altre classi nello stesso pacchetto.

E in realtà c'è un quarto " default " livello di accesso, quando il modificatore viene omesso, che fornisce l'accesso ad altre classi nello stesso pacchetto.

Quindi protetto è tra l'accesso predefinito e pubblico .

Per essere più specifici, ti aspetti che protetto funzioni come in C ++.

Tuttavia, in Java, ha un significato diverso. In Java, un metodo protetto è disponibile per la classe (ovviamente), tutte le altre classi nello stesso pacchetto ed eventuali sottoclassi di questa classe. Le classi in altri pacchetti non avranno accesso a meno che non subclassino questa classe originale.

Visualizza questa domanda simile per informazioni più specifiche sugli indicatori di eredità.

Personalmente, non uso quasi mai protetto . Sviluppo applicazioni piuttosto che framework, quindi ho molte più probabilità di definire metodi public , dati private e, abbastanza spesso, contrassegnare la mia intera classe come final .

Esistono in realtà quattro livelli di accesso: "pubblico", "protetto", "privato". & Amp; impostazione predefinita nota anche come pacchetto privato o pacchetto protetto. L'impostazione predefinita limita l'accessibilità al pacchetto. L'impostazione predefinita è abbastanza utile e lo uso spesso.

Puoi chiamare b.getMessage () perché b è di tipo Bloo , che estende Blah e getMessage () è protetto. Protetto, come hai detto, consente alle sottoclassi di accedere al metodo.

Tuttavia, hai i seguenti errori:

  • Chiamare super () senza argomenti nel costruttore Bloo è un errore. Il compilatore non riesce a trovare il costruttore senza parametri Blah perché ne hai definito uno con un parametro String.
  • Chiamare nuovo Blah () nel metodo TestBlah main è un errore per lo stesso motivo di cui sopra.
  • Fare riferimento a a.testing e b.testing è un errore perché non è stata definita la variabile testing per nessuna classe.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top