Es kann vorkommen, dass es nützlich ist, Werte zu haben, die für alle Instanzen einer bestimmten Klasse gelten. Statische Felder und statische Konstanten ermöglichen diese Art der Freigabe durch Zugehörigkeit zu Klasse und nicht zu den eigentlichen Objekten.
Normalerweise können in einer Klasse definierte Felder und Methoden nur verwendet werden, wenn ein Objekt dieses Klassentyps erstellt wurde. Stellen Sie sich zum Beispiel eine einfache Item-Klasse vor, die den Überblick über Waren in einem Geschäft behält:
public class Item
private String itemName;
public Item (String itemName)
this.itemName = itemName;
public String getItemName ()
return itemName;
Um die Methode getItemName () verwenden zu können, müssen wir zuerst ein Item-Objekt erstellen, in diesem Fall catFood:
public class StaticExample
public static void main (String [] args)
Item catFood = neues Item ("Whiskas");
System.out.println (catFood.getItemName ());
Wenn der statische Modifikator jedoch in einer Feld- oder Methodendeklaration enthalten ist, ist keine Instanz der Klasse erforderlich, um das Feld oder die Methode zu verwenden. Sie sind der Klasse und nicht einem einzelnen Objekt zugeordnet. Wenn Sie sich das obige Beispiel noch einmal ansehen, werden Sie feststellen, dass der statische Modifikator bereits in der Deklaration der Hauptmethode verwendet wird:
Öffentlichkeit statisch void main (String [] args)
Die Hauptmethode ist eine statische Methode, bei der kein Objekt vorhanden sein muss, bevor es aufgerufen werden kann. Da main () der Ausgangspunkt für jede Java-Anwendung ist, gibt es tatsächlich noch keine Objekte, die es aufrufen könnten. Wenn Sie Lust auf ein Programm haben, das sich ständig selbst aufruft, können Sie Folgendes tun:
public class StaticExample
public static void main (String [] args)
String [] s = "random", "string";
StaticExample.main (s);
Nicht sehr nützlich, aber beachten Sie, wie die main () -Methode ohne eine Instanz einer StaticExample-Klasse aufgerufen werden kann.
Statische Felder werden auch als Klassenfelder bezeichnet. Es handelt sich lediglich um Felder, deren Deklarationen den statischen Modifikator enthalten. Kehren wir zum Beispiel zur Item-Klasse zurück und fügen ein statisches Feld hinzu:
public class Item
// statisches Feld uniqueId
private static int uniqueId = 1;
private int itemId;
private String itemName;
public Item (String itemName)
this.itemName = itemName;
itemId = uniqueId;
uniqueId ++;
Die Felder itemId und itemName sind normale nicht statische Felder. Wenn eine Instanz einer Item-Klasse erstellt wird, enthalten diese Felder Werte, die in diesem Objekt enthalten sind. Wenn ein anderes Item-Objekt erstellt wird, enthält es auch die Felder itemId und itemName zum Speichern von Werten.
Das statische Feld uniqueId enthält jedoch einen Wert, der für alle Item-Objekte gleich ist. Wenn es 100 Artikelobjekte gibt, gibt es 100 Instanzen der Felder itemId und itemName, aber nur ein statisches Feld uniqueId.
Im obigen Beispiel wird uniqueId verwendet, um jedem Item-Objekt eine eindeutige Nummer zu geben. Dies ist einfach zu bewerkstelligen, wenn jedes erstellte Objekt Item den aktuellen Wert im statischen Feld uniqueId verwendet und dann um eins erhöht. Die Verwendung eines statischen Felds bedeutet, dass nicht jedes Objekt die anderen Objekte kennen muss, um eine eindeutige ID zu erhalten. Dies kann hilfreich sein, wenn Sie die Reihenfolge kennen möchten, in der die Artikelobjekte erstellt wurden.
Statische Konstanten sind genau wie statische Felder, nur dass ihre Werte nicht geändert werden können. In der Felddeklaration wird die Finale und statisch Modifikatoren werden beide verwendet. Beispielsweise sollte die Item-Klasse möglicherweise die Länge des itemName einschränken. Wir könnten eine statische Konstante maxItemNameLength erstellen:
public class Item
private static int id = 1;
public static final int maxItemNameLength = 20;
private int itemId;
private String itemName;
public Item (String itemName)
if (itemName.length ()> maxItemNameLength)
this.itemName = itemName.substring (0,20);
sonst
this.itemName = itemName;
itemId = id;
id ++;
Wie bei statischen Feldern werden statische Konstanten der Klasse und nicht einem einzelnen Objekt zugeordnet:
public class StaticExample
public static void main (String [] args)
Item catFood = neues Item ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
Bei der statischen Konstante maxItemNameLength sind zwei wichtige Punkte zu beachten:
Statische Konstanten sind in der gesamten Java-API sichtbar. In der Integer-Wrapper-Klasse gibt es beispielsweise zwei, die die Maximal- und Minimalwerte speichern, die ein int-Datentyp haben kann:
System.out.println ("Der Maximalwert für int ist:" + Integer.MAX_VALUE);
System.out.println ("Der Mindestwert für int ist:" + Integer.MIN_VALUE);
Ausgabe:
Der maximale Wert für int ist: 2147483647
Der Mindestwert für int ist: -2147483648