Java Language
Visibilità (controllo dell'accesso ai membri di una classe)
Ricerca…
Sintassi
- nome del tipo pubblico [= valore];
- nome del tipo privato [= valore];
- nome del tipo protetto [= valore];
- nome del tipo [= valore];
- nome di classe pubblica {
- nome della classe{
Osservazioni
Dal tutorial di Java :
I modificatori del livello di accesso determinano se altre classi possono utilizzare un particolare campo o richiamare un particolare metodo. Esistono due livelli di controllo degli accessi:
- Al livello più alto:
public
o package-private (nessun modificatore esplicito). - A livello di membro:
public
,private
,protected
o privato del pacchetto (nessun modificatore esplicito).
Una classe può essere dichiarata con il modificatore public
, nel qual caso tale classe è visibile a tutte le classi ovunque. Se una classe non ha alcun modificatore (l'impostazione predefinita, nota anche come pacchetto-privato ), è visibile solo all'interno del proprio pacchetto.
A livello di membro, puoi anche usare il modificatore public
o nessun modificatore ( pacchetto-privato ) proprio come con le classi di primo livello e con lo stesso significato. Per i membri, ci sono due ulteriori modificatori di accesso: private
e protected
. Il modificatore private
specifica che è possibile accedere al membro solo nella sua classe. Il modificatore protected
specifica che è possibile accedere al membro solo all'interno del proprio pacchetto (come con package-private ) e, inoltre, da una sottoclasse della sua classe in un altro pacchetto.
La seguente tabella mostra l'accesso ai membri consentiti da ciascun modificatore.
Livelli di accesso:
Modificatore | Classe | Pacchetto | sottoclasse | Mondo |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
nessun modificatore | Y | Y | N | N |
private | Y | N | N | N |
Membri dell'interfaccia
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
I membri dell'interfaccia hanno sempre visibilità pubblica, anche se la parola chiave public
viene omessa. Quindi sia foo()
, bar()
, TEXT
, ANSWER
, X
e Y
hanno visibilità pubblica. Tuttavia, l'accesso può essere ancora limitato dall'interfaccia contenente - poiché MyInterface
ha visibilità pubblica, i suoi membri possono essere accessibili da qualsiasi luogo, ma se MyInterface
avesse avuto visibilità del pacchetto, i suoi membri sarebbero stati accessibili solo all'interno dello stesso pacchetto.
Visibilità pubblica
Visibile alla classe, al pacchetto e alla sottoclasse.
Vediamo un esempio con il test di classe.
public class Test{
public int number = 2;
public Test(){
}
}
Ora proviamo a creare un'istanza della classe. In questo esempio, possiamo accedere al number
perché è public
.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Visibilità privata
private
visibilità private
consente a una variabile di accedere solo alla sua classe. Essi sono spesso usati in combinazione con public
getter e setter.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Visibilità del pacchetto
Senza alcun modificatore , l'impostazione predefinita è la visibilità del pacchetto. Dalla documentazione Java, "[visibilità pacchetto] indica se le classi nello stesso pacchetto della classe (indipendentemente dalla loro parentela) hanno accesso al membro." In questo esempio di javax.swing
,
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
trova nello stesso pacchetto, quindi DEBUG_GRAPHICS_LOADED
è accessibile.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
Questo articolo fornisce alcune informazioni sull'argomento.
Visibilità protetta
Cause di visibilità protetta significa che questo membro è visibile per il suo pacchetto, insieme a una qualsiasi delle sue sottoclassi.
Come esempio:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Ora estenderemo questa classe e proveremo ad accedere a uno dei suoi membri protected
.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
Sarai anche in grado di accedere a un membro protected
senza estenderlo se accederai dallo stesso pacchetto.
Nota che questo modificatore funziona solo sui membri di una classe, non sulla classe stessa.
Riepilogo dei modificatori di accesso ai membri della classe
Modificatore d'accesso | Visibilità | Eredità |
---|---|---|
Privato | Solo la lezione | Non può essere ereditato |
Nessun modificatore / pacchetto | Nel pacchetto | Disponibile se sottoclasse nel pacchetto |
protetta | Nel pacchetto | Disponibile in sottoclasse |
Pubblico | Ovunque | Disponibile in sottoclasse |
C'era una volta un modificatore private protected
(entrambe le parole chiave contemporaneamente) che poteva essere applicato a metodi o variabili per renderli accessibili da una sottoclasse esterna al pacchetto, ma renderli privati delle classi in quel pacchetto. Tuttavia, questo è stato rimosso nella versione di Java 1.0 .