Ricerca…


Sintassi

  • public static int myVariable; // Dichiarazione di una variabile statica
  • public static myMethod () {} // Dichiarazione di un metodo statico
  • public static final double MY_CONSTANT; // Dichiarazione di una variabile costante condivisa tra tutte le istanze della classe
  • doppia finale pubblica MY_CONSTANT; // Dichiarazione di una variabile costante specifica per questa istanza della classe (utilizzata al meglio in un costruttore che genera una costante diversa per ogni istanza)

Uso statico per dichiarare le costanti

Poiché la parola chiave static viene utilizzata per accedere a campi e metodi senza una classe istanziata, può essere utilizzata per dichiarare le costanti da utilizzare in altre classi. Queste variabili rimarranno costanti in ogni istanza della classe. Per convenzione, static variabili static sono sempre ALL_CAPS e usano caratteri di sottolineatura piuttosto che cammello. ex:

 static E STATIC_VARIABLE_NAME

Poiché le costanti non possono cambiare, è possibile utilizzare anche la static con il modificatore final :

Ad esempio, per definire la costante matematica di pi:

public class MathUtilities {
    
    static final double PI = 3.14159265358

}

Quale può essere utilizzato in qualsiasi classe come costante, ad esempio:

public class MathCalculations {
   
    //Calculates the circumference of a circle
    public double calculateCircumference(double radius) {
        return (2 * radius * MathUtilities.PI);
    }

}

Usando statico con questo

Statico fornisce un metodo o una memoria variabile che non è allocata per ogni istanza della classe. Piuttosto, la variabile statica è condivisa tra tutti i membri della classe. Per inciso, cercando di trattare la variabile statica come un membro dell'istanza della classe si otterrà un avvertimento:

public class Apple {
    public static int test;
    public int test2;
}

Apple a = new Apple();
a.test = 1; // Warning
Apple.test = 1; // OK
Apple.test2 = 1; // Illegal: test2 is not static
a.test2 = 1; // OK

I metodi dichiarati statici si comportano più o meno allo stesso modo, ma con una restrizione aggiuntiva:

Non è possibile utilizzare la this parola chiave in loro!

public class Pineapple {

    private static int numberOfSpikes;   
    private int age;

    public static getNumberOfSpikes() {
        return this.numberOfSpikes; // This doesn't compile
    }


    public static getNumberOfSpikes() {
        return numberOfSpikes; // This compiles
    }

}

In generale, è meglio dichiarare static metodi che si applicano a diverse istanze di una classe (come i metodi clone) static , mantenendo metodi come equals() come non statici. Il main metodo di un programma Java è sempre statica, il che significa che la parola this non può essere utilizzato all'interno main() .

Riferimento a membri non statici dal contesto statico

Le variabili e i metodi statici non fanno parte di un'istanza. Ci sarà sempre una singola copia di quella variabile, indipendentemente dal numero di oggetti creati da una determinata classe.

Ad esempio potresti voler avere una lista immutabile di costanti, sarebbe una buona idea tenerla statica e inizializzarla solo una volta all'interno di un metodo statico. Ciò ti darebbe un significativo guadagno di prestazioni se crei diverse istanze di una particolare classe su base regolare.

Inoltre puoi anche avere un blocco statico in una classe. Puoi usarlo per assegnare un valore predefinito a una variabile statica. Vengono eseguiti solo una volta quando la classe viene caricata in memoria.

Le variabili di istanza come suggeriscono il nome dipendono da un'istanza di un oggetto particolare, vivono per servire i capricci di esso. Puoi giocare con loro durante un particolare ciclo di vita di un oggetto.

Tutti i campi e i metodi di una classe utilizzati all'interno di un metodo statico di quella classe devono essere statici o locali. Se si tenta di utilizzare variabili o metodi di istanza (non statici), il codice non verrà compilato.

public class Week {
    static int daysOfTheWeek = 7; // static variable
    int dayOfTheWeek; // instance variable
    
    public static int getDaysLeftInWeek(){
        return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
    }

    public int getDaysLeftInWeek(){
        return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
    }

    public static int getDaysLeftInTheWeek(int today){
        return Week.daysOfTheWeek-today; // this is valid
    }
    
}


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