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.