In Java i modificatori di accesso sono strumenti essenziali che definiscono il modo in cui i membri di una classe come i metodi variabili e persino la classe stessa sono accessibili da altre parti del nostro programma.
In Java sono disponibili 4 tipi di modificatori di accesso:
Modificatori di accesso in JavaModificatore di accesso privato
Il modificatore di accesso privato viene specificato utilizzando la parola chiave private. I metodi o i membri dati dichiarati come privati sono accessibili solo all'interno della classe in cui sono dichiarati.
Java
class Person { // private variable private String name; public void setName(String name) { this.name = name; // accessible within class } public String getName() { return name; } } public class Geeks { public static void main(String[] args) { Person p = new Person(); p.setName('Alice'); // System.out.println(p.name); // Error: 'name' // has private access System.out.println(p.getName()); } }
Produzione
Alice
Spiegazione: L'accesso diretto al nome non è consentito all'esterno della Persona che applica l'incapsulamento.
Modificatore di accesso predefinito
Quando non viene specificato alcun modificatore di accesso per un metodo di classe o un membro dati, si dice che abbia il modificatore di accesso predefinito per impostazione predefinita. Ciò significa che solo le classi all'interno dello stesso pacchetto possono accedervi.
Javaclass Car { String model; // default access } public class Main { public static void main(String[] args){ Car c = new Car(); c.model = 'Tesla'; // accessible within the same package System.out.println(c.model); } }
Produzione
Tesla
Spiegazione: I membri con accesso predefinito non possono accedere dalle classi di un pacchetto diverso.
Geeks.java: Classe predefinita all'interno dello stesso pacchetto
Java// default access modifier package p1; // Class Geek is having // Default access modifier class Geek { void display() { System.out.println('Hello World!'); } }
GeeksNew.java: Classe predefinita da un pacchetto diverso (per contrasto)
C++// package with default modifier package p2; import p1.*; // importing package p1 // This class is having // default access modifier class GeekNew { public static void main(String args[]) { // Accessing class Geek from package p1 Geek o = new Geek(); o.display(); } }
Spiegazione: In questo esempio il programma mostrerà l'errore in fase di compilazione quando proviamo ad accedere a una classe modificata predefinita da un pacchetto diverso.
Modificatore di accesso protetto
Il modificatore di accesso protetto viene specificato utilizzando la parola chiave protected. I metodi o i membri dati dichiarati come protetti sono accessibili all'interno dello stesso pacchetto o sottoclassi in pacchetti diversi.
Javaclass Vehicle { protected int speed; // protected member } class Bike extends Vehicle { void setSpeed(int s) { speed = s; // accessible in subclass } int getSpeed() { return speed; // accessible in subclass } } public class Main { public static void main(String[] args){ Bike b = new Bike(); b.setSpeed(100); System.out.println('Access via subclass method: ' + b.getSpeed()); Vehicle v = new Vehicle(); System.out.println(v.speed); } }
Produzione
Access via subclass method: 100 0
Spiegazione: speed è accessibile tramite metodi di sottoclasse e altre classi nello stesso pacchetto, ma l'accesso diretto da un pacchetto diverso (non sottoclasse) fallirebbe.
Modificatore di accesso pubblico
Il modificatore di accesso pubblico viene specificato utilizzando la parola chiave public. I membri pubblici sono accessibili da qualsiasi punto del programma. Non esiste alcuna restrizione sull'ambito dei membri dei dati pubblici.
Javaclass MathUtils { public static int add(int a int b) { return a + b; } } public class Main { public static void main(String[] args) { System.out.println(MathUtils.add(5 10)); // accessible anywhere } }
Produzione
15
Spiegazione: add() è accessibile a livello globale grazie al modificatore public.
Le classi o le interfacce di livello superiore non possono essere dichiarate private perché privato significa "visibile solo all'interno della classe che le racchiude".
Tabella comparativa dei modificatori di accesso in Java
Modificatore di accessoQuando utilizzare ciascun modificatore di accesso nei progetti del mondo reale
- Privato: L'idea dovrebbe essere quella di utilizzare un accesso il più restrittivo possibile, quindi il privato dovrebbe essere utilizzato il più possibile.
- Predefinito (Package-Private): spesso utilizzato in utilità con ambito pacchetto o classi helper.
- Protetto: Comunemente utilizzato nei progetti basati sull'ereditarietà come le estensioni del framework.
- Pubblico : viene utilizzato per le classi di servizio degli endpoint API o i metodi di utilità condivisi tra diverse parti di un'applicazione.