Java - Modificatori di accesso
Java fornisce una serie di modificatori di accesso per impostare i livelli di accesso per classi, variabili, metodi e costruttori. I quattro livelli di accesso sono:
- Visibile al pacchetto, predefinito. Non sono necessari modificatori.
- Visibile solo alla classe (privato).
- Visibile al mondo (pubblico).
- Visibile al pacchetto e tutte le sottoclassi (protette).
Modificatore di accesso predefinito: nessuna parola chiave
Modificatore di accesso predefinito significa che non dichiariamo esplicitamente un modificatore di accesso per una classe, un campo, un metodo, ecc.
Una variabile o un metodo dichiarato senza alcun modificatore del controllo di accesso è disponibile per qualsiasi altra classe nello stesso pacchetto. I campi in un'interfaccia sono finali statici pubblici implicitamente ei metodi in un'interfaccia sono pubblici per impostazione predefinita.
Esempio
Variabili e metodi possono essere dichiarati senza alcun modificatore, come negli esempi seguenti:
String version = "1.5.1";
boolean processOrder() {
return true;
}
Modificatore di accesso privato - Privato
È possibile accedere a metodi, variabili e costruttori dichiarati privati solo all'interno della classe dichiarata stessa.
Il modificatore di accesso privato è il livello di accesso più restrittivo. La classe e le interfacce non possono essere private.
È possibile accedere alle variabili dichiarate private all'esterno della classe, se nella classe sono presenti metodi getter pubblici.
L'utilizzo del modificatore privato è il modo principale in cui un oggetto si incapsula e nasconde i dati dal mondo esterno.
Esempio
La classe seguente utilizza il controllo dell'accesso privato:
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
In questo caso, la variabile di formato della classe Logger è privata, quindi non è possibile per altre classi recuperare o impostare direttamente il suo valore.
Quindi, per rendere questa variabile disponibile al mondo esterno, abbiamo definito due metodi pubblici: getFormat () , che restituisce il valore di format, e setFormat (String) , che ne imposta il valore.
Modificatore di accesso pubblico - Pubblico
Una classe, un metodo, un costruttore, un'interfaccia, ecc. Dichiarata pubblica è accessibile da qualsiasi altra classe. Pertanto, è possibile accedere a campi, metodi, blocchi dichiarati all'interno di una classe pubblica da qualsiasi classe appartenente all'universo Java.
Tuttavia, se la classe pubblica a cui stiamo tentando di accedere si trova in un pacchetto diverso, la classe pubblica deve ancora essere importata. A causa dell'ereditarietà delle classi, tutti i metodi e le variabili pubblici di una classe vengono ereditati dalle sue sottoclassi.
Esempio
La seguente funzione utilizza il controllo dell'accesso pubblico:
public static void main(String[] arguments) {
// ...
}
Il metodo main () di un'applicazione deve essere pubblico. Altrimenti, non potrebbe essere chiamato da un interprete Java (come java) per eseguire la classe.
Modificatore di accesso protetto: protetto
È possibile accedere alle variabili, metodi e costruttori dichiarati protetti in una superclasse solo dalle sottoclassi di un altro pacchetto o da qualsiasi classe all'interno del pacchetto della classe dei membri protetti.
Il modificatore di accesso protetto non può essere applicato alla classe e alle interfacce. Metodi, campi possono essere dichiarati protetti, tuttavia metodi e campi in un'interfaccia non possono essere dichiarati protetti.
L'accesso protetto offre alla sottoclasse la possibilità di utilizzare il metodo o la variabile di supporto, impedendo a una classe non correlata di tentare di utilizzarlo.
Esempio
La seguente classe genitore utilizza il controllo dell'accesso protetto, per consentire alla sua classe figlia di ignorare il metodo openSpeaker () -
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// implementation details
}
}
class StreamingAudioPlayer extends AudioPlayer {
boolean openSpeaker(Speaker sp) {
// implementation details
}
}
Qui, se definiamo il metodo openSpeaker () come privato, non sarebbe accessibile da nessun'altra classe diversa da AudioPlayer . Se lo definiamo pubblico, diventerebbe accessibile a tutto il mondo esterno. Ma la nostra intenzione è di esporre questo metodo solo alla sua sottoclasse, ecco perché abbiamo usato il modificatore protetto.
Controllo degli accessi ed ereditarietà
Vengono applicate le seguenti regole per i metodi ereditati:
Anche i metodi dichiarati pubblici in una superclasse devono essere pubblici in tutte le sottoclassi.
I metodi dichiarati protetti in una superclasse devono essere protetti o pubblici nelle sottoclassi; non possono essere privati.
I metodi dichiarati privati non vengono ereditati affatto, quindi non esistono regole per loro.