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 .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow