Er kunnen momenten zijn dat het handig is om waarden te hebben die worden gedeeld door alle instanties van een bepaalde klasse. Statische velden en statische constanten maken dit type delen mogelijk door tot de klasse en niet voor de werkelijke objecten.
Normaal gesproken kunnen velden en methoden die in een klasse zijn gedefinieerd alleen worden gebruikt wanneer een object van dat klasse-type is gemaakt. Overweeg bijvoorbeeld een eenvoudige itemklasse die goederen in een winkel bijhoudt:
public class artikel
privé String itemName;
public Item (String itemName)
this.itemName = itemName;
public String getItemName ()
itemnaam retourneren;
Om de methode getItemName () te kunnen gebruiken, moeten we eerst een Item-object maken, in dit geval catFood:
public class StaticExample
public static void main (String [] args)
Artikel catFood = nieuw artikel ("Whiskas");
System.out.println (catFood.getItemName ());
Als de statische modificator echter is opgenomen in een veld- of methodedeclaratie, is geen instantie van de klasse vereist om het veld of de methode te gebruiken - ze zijn gekoppeld aan de klasse en niet aan een afzonderlijk object. Als u terugkijkt op het bovenstaande voorbeeld, zult u zien dat de statische modificator al wordt gebruikt in de belangrijkste methodeverklaring:
openbaar statisch void main (String [] args)
De hoofdmethode is een statische methode waarvoor geen object hoeft te bestaan voordat het kan worden aangeroepen. Omdat main () het startpunt is voor elke Java-toepassing, zijn er in feite al geen objecten om deze aan te roepen. Je zou dit kunnen doen, als je zin hebt in een programma dat zichzelf voortdurend noemt:
public class StaticExample
public static void main (String [] args)
String [] s = "random", "string";
StaticExample.main (s);
Niet erg handig, maar merk op hoe de methode main () kan worden aangeroepen zonder een instantie van een klasse StaticExample.
Statische velden worden ook wel klassenvelden genoemd. Het zijn eenvoudigweg velden met de statische modificator in hun aangiften. Laten we bijvoorbeeld teruggaan naar de klasse Item en een statisch veld toevoegen:
public class artikel
// statisch veld uniqueId
private static int uniqueId = 1;
privé int itemId;
privé String itemName;
public Item (String itemName)
this.itemName = itemName;
itemId = uniqueId;
UniqueID ++;
De velden itemId en itemName zijn normale niet-statische velden. Wanneer een instantie van een itemklasse wordt gemaakt, hebben deze velden waarden die binnen dat object worden bewaard. Als een ander Item-object wordt gemaakt, heeft het ook itemId en itemName-velden voor het opslaan van waarden.
Het statische unieke ID-veld heeft echter een waarde die hetzelfde is voor alle Item-objecten. Als er 100 Item-objecten zijn, zijn er 100 instanties van de velden itemId en itemName, maar slechts één uniek statisch veld.
In het bovenstaande voorbeeld wordt uniqueId gebruikt om elk itemobject een uniek nummer te geven. Dit is eenvoudig te doen als elk gemaakt Item-object de huidige waarde in het statische unieke ID neemt en deze vervolgens met één verhoogt. Het gebruik van een statisch veld betekent dat elk object niet van de andere objecten op de hoogte hoeft te zijn om een uniek ID te krijgen. Dit kan handig zijn als u de volgorde wilt weten waarin de Item-objecten zijn gemaakt.
Statische constanten zijn precies zoals statische velden, behalve dat hun waarden niet kunnen worden gewijzigd. In de velddeclaratie, de laatste en statisch modifiers worden beide gebruikt. Misschien moet de klasse Item bijvoorbeeld een beperking opleggen aan de lengte van de itemName. We kunnen een statische constante maxItemNameLength maken:
public class artikel
private statische int id = 1;
public static final int maxItemNameLength = 20;
privé int itemId;
privé String itemName;
public Item (String itemName)
if (itemName.length ()> maxItemNameLength)
this.itemName = itemName.substring (0,20);
anders
this.itemName = itemName;
itemId = id;
id ++;
Net als bij statische velden, worden statische constanten geassocieerd met de klasse in plaats van een individueel object:
public class StaticExample
public static void main (String [] args)
Artikel catFood = nieuw artikel ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
Er zijn twee belangrijke dingen om op te merken over de statische constante maxItemNameLength:
Statische constanten zijn overal in de Java API te zien. De klasse integer wrapper heeft bijvoorbeeld twee die de maximale en minimale waarden opslaan die een gegevenstype int kan hebben:
System.out.println ("De maximale waarde voor int is:" + Integer.MAX_VALUE);
System.out.println ("De min waarde voor int is:" + Integer.MIN_VALUE);
Output:
De maximale waarde voor int is: 2147483647
De min waarde voor int is: -2147483648