Modificatori di accesso in Java

1. Panoramica

In questo tutorial, esamineremo i modificatori di accesso in Java, che vengono utilizzati per impostare il livello di accesso a classi, variabili, metodi e costruttori.

In poche parole, ci sono quattro modificatori di accesso: pubblico , privato , protetto e predefinito (nessuna parola chiave).

Prima di iniziare, notiamo che una classe di primo livello può utilizzare solo modificatori di accesso pubblici o predefiniti . A livello di membro, possiamo usarli tutti e quattro.

2. Predefinito

Quando non usiamo esplicitamente alcuna parola chiave, Java imposterà un accesso predefinito a una determinata classe, metodo o proprietà. Il modificatore di accesso predefinito è anche chiamato pacchetto privato , il che significa che tutti i membri sono visibili all'interno dello stesso pacchetto ma non sono accessibili da altri pacchetti:

package com.baeldung.accessmodifiers; public class SuperPublic { static void defaultMethod() { ... } }

defaultMethod () è accessibile in un'altra classe dello stesso pacchetto:

package com.baeldung.accessmodifiers; public class Public { public Public() { SuperPublic.defaultMethod(); // Available in the same package. } }

Tuttavia, non è disponibile in altri pacchetti.

3. Pubblico

Se aggiungiamo la parola chiave public a una classe, metodo o proprietà, la rendiamo disponibile a tutto il mondo , ovvero tutte le altre classi in tutti i pacchetti potranno utilizzarla. Questo è il modificatore di accesso meno restrittivo:

package com.baeldung.accessmodifiers; public class SuperPublic { public static void publicMethod() { ... } }

publicMethod () è disponibile in un altro pacchetto:

package com.baeldung.accessmodifiers.another; import com.baeldung.accessmodifiers.SuperPublic; public class AnotherPublic { public AnotherPublic() { SuperPublic.publicMethod(); // Available everywhere. Let's note different package. } }

Per maggiori dettagli su come si comporta la parola chiave public quando applicata a una classe, interfaccia, classe pubblica annidata o interfaccia e metodo, vedere l'articolo dedicato.

4. Privato

Qualsiasi metodo, proprietà o costruttore con la parola chiave private è accessibile solo dalla stessa classe . Questo è il modificatore di accesso più restrittivo ed è fondamentale per il concetto di incapsulamento. Tutti i dati saranno nascosti al mondo esterno:

package com.baeldung.accessmodifiers; public class SuperPublic { static private void privateMethod() { ... } private void anotherPrivateMethod() { privateMethod(); // available in the same class only. } }

Questo articolo più dettagliato mostrerà come si comporta la parola chiave private quando applicata a un campo, un costruttore, un metodo e una classe interna.

5. Protetto

Tra i livelli di accesso pubblico e privato , c'è il modificatore di accesso protetto .

Se dichiariamo un metodo, una proprietà o un costruttore con la parola chiave protected , possiamo accedere al membro dallo stesso pacchetto (come con il livello di accesso privato del pacchetto ) e inoltre da tutte le sottoclassi della sua classe , anche se si trovano in altri pacchetti:

package com.baeldung.accessmodifiers; public class SuperPublic { static protected void protectedMethod() { ... } }

protectedMethod () è disponibile in sottoclassi (indipendentemente dal pacchetto):

package com.baeldung.accessmodifiers.another; import com.baeldung.accessmodifiers.SuperPublic; public class AnotherSubClass extends SuperPublic { public AnotherSubClass() { SuperPublic.protectedMethod(); // Available in subclass. Let's note different package. } }

L'articolo dedicato descrive di più sulla parola chiave quando utilizzata in un campo, metodo, costruttore, classe interna e l'accessibilità nello stesso pacchetto o in un pacchetto diverso.

6. Confronto

La tabella seguente riassume i modificatori di accesso disponibili. Possiamo vedere che una classe, indipendentemente dai modificatori di accesso utilizzati, ha sempre accesso ai suoi membri:

Modificatore Classe Pacchetto Sottoclasse Mondo
pubblico
Y Y Y Y
protetto
Y Y Y N
predefinito
Y Y N N
privato
Y N N N

7. Conclusione

In questo breve articolo, abbiamo esaminato i modificatori di accesso in Java.

È buona norma utilizzare il livello di accesso più restrittivo possibile per un dato membro per evitare abusi. Dovremmo sempre usare il modificatore di accesso privato a meno che non ci sia una buona ragione per non farlo.

Il livello di accesso pubblico deve essere utilizzato solo se un membro fa parte di un'API.

Come sempre, gli esempi di codice sono disponibili su Github.