Ci possono essere momenti in cui è utile avere valori condivisi tra tutte le istanze di una determinata classe. I campi statici e le costanti statiche consentono questo tipo di condivisione appartenendo al classe e non agli oggetti reali.
Normalmente campi e metodi definiti in una classe possono essere utilizzati solo quando è stato creato un oggetto di quel tipo di classe. Ad esempio, considera una semplice classe di articoli che tiene traccia delle merci in un negozio:
oggetto di classe pubblica
stringa privata itemName;
Articolo pubblico (String itemName)
this.itemName = itemName;
public String getItemName ()
return itemName;
Per poter utilizzare il metodo getItemName (), dobbiamo prima creare un oggetto Item, in questo caso catFood:
public class StaticExample
public static void main (String [] args)
Item catFood = new Item ("Whiskas");
System.out.println (catFood.getItemName ());
Tuttavia, se il modificatore statico è incluso in un campo o in una dichiarazione di metodo, non è richiesta alcuna istanza della classe per utilizzare il campo o il metodo: sono associati alla classe e non a un singolo oggetto. Se guardi indietro all'esempio sopra, vedrai che il modificatore statico è già in uso nella dichiarazione del metodo principale:
pubblico statico void main (String [] args)
Il metodo principale è un metodo statico che non richiede l'esistenza di un oggetto prima che possa essere chiamato. Poiché main () è il punto di partenza per qualsiasi applicazione Java, in realtà non ci sono oggetti già esistenti per chiamarlo. Se potessi avere un programma che si chiama continuamente, potresti farlo:
public class StaticExample
public static void main (String [] args)
String [] s = "random", "string";
StaticExample.main (s);
Non molto utile, ma nota come il metodo main () può essere chiamato senza un'istanza di una classe StaticExample.
I campi statici sono anche noti come campi di classe. Sono semplicemente campi che hanno il modificatore statico nelle loro dichiarazioni. Ad esempio, torniamo alla classe Item e aggiungiamo un campo statico:
oggetto di classe pubblica
// campo statico uniqueId
private static int uniqueId = 1;
private int itemId;
stringa privata itemName;
Articolo pubblico (String itemName)
this.itemName = itemName;
itemId = uniqueId;
UniqueId ++;
I campi itemId e itemName sono normali campi non statici. Quando viene creata un'istanza di una classe Item, questi campi avranno valori contenuti all'interno di quell'oggetto. Se viene creato un altro oggetto Item, anche questo avrà i campi itemId e itemName per l'archiviazione dei valori.
Il campo statico uniqueId, tuttavia, contiene un valore che sarà lo stesso per tutti gli oggetti Item. Se ci sono 100 oggetti Item, ci saranno 100 istanze dei campi itemId e itemName, ma solo un campo statico uniqueId.
Nell'esempio precedente, uniqueId viene utilizzato per assegnare a ciascun oggetto Item un numero univoco. Questo è facile da fare se ogni oggetto Item creato prende il valore corrente nel campo statico uniqueId e lo incrementa di uno. L'uso di un campo statico significa che ogni oggetto non ha bisogno di conoscere gli altri oggetti per ottenere un ID univoco. Ciò potrebbe essere utile se si desidera conoscere l'ordine in cui sono stati creati gli oggetti Item.
Le costanti statiche sono esattamente come i campi statici, tranne per il fatto che i loro valori non possono essere modificati. Nella dichiarazione sul campo, il finale e statico i modificatori sono entrambi usati. Ad esempio, forse la classe Item dovrebbe imporre una restrizione sulla lunghezza di itemName. Potremmo creare una costante statica maxItemNameLength:
oggetto di classe pubblica
private stat int int = 1;
public static final int maxItemNameLength = 20;
private int itemId;
stringa privata itemName;
Articolo pubblico (String itemName)
if (itemName.length ()> maxItemNameLength)
this.itemName = itemName.substring (0,20);
altro
this.itemName = itemName;
itemId = id;
id ++;
Come per i campi statici, le costanti statiche sono associate alla classe anziché a un singolo oggetto:
public class StaticExample
public static void main (String [] args)
Item catFood = new Item ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
Ci sono due cose importanti da notare sulla costante statica maxItemNameLength:
Costanti statiche possono essere visualizzate in tutta l'API Java. Ad esempio, la classe wrapper integer ne ha due che memorizzano i valori massimo e minimo che un tipo di dati int può avere:
System.out.println ("Il valore massimo per int è:" + Integer.MAX_VALUE);
System.out.println ("Il valore minimo per int è:" + Integer.MIN_VALUE);
Produzione:
Il valore massimo per int è: 2147483647
Il valore minimo per int è: -2147483648