Accesso protetto Java non funzionante
-
22-07-2019 - |
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);
}
}
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 costruttoreBloo
è un errore. Il compilatore non riesce a trovare il costruttore senza parametriBlah
perché ne hai definito uno con un parametro String. - Chiamare
nuovo Blah ()
nel metodoTestBlah
main
è un errore per lo stesso motivo di cui sopra. - Fare riferimento a
a.testing
eb.testing
è un errore perché non è stata definita la variabiletesting
per nessuna classe.