Der kan være tidspunkter, hvor det er nyttigt at have værdier, der deles på tværs af alle tilfælde af en bestemt klasse. Statiske felter og statiske konstanter aktiver denne type deling ved at høre til klasse og ikke til de faktiske objekter.
Den statiske ændrer
Normalt kan felter og metoder, der er defineret i en klasse, kun bruges, når der er oprettet et objekt af den klassetype. Overvej for eksempel en enkel vareklasse, der holder styr på varer i en butik:
offentlig klasse vare {
privat strengstreng vare;
offentlig vare (strengnavn)
{
this.itemName = itemName;
}
public String getItemName ()
{
return itemName;
}
}
For at kunne bruge metoden getItemName (), skal vi først oprette et objektobjekt, i dette tilfælde catFood:
offentlig klasse StaticExample {
public static void main (String [] args) {
Vare catFood = ny vare ("Whiskas");
System.out.println (catFood.getItemName ());
}
}
Hvis den statiske modifikator imidlertid er inkluderet i en felt- eller metodedeklaration, er der ingen forekomst af klassen kræves for at bruge feltet eller metoden - de er knyttet til klassen og ikke et individ objekt. Hvis du ser tilbage på ovenstående eksempel, vil du se, at den statiske modifikator allerede bruges i
hovedmetodedeklaration:offentlig statisk void main (streng [] args) {
Det hovedmetode er en statisk metode der kræver ikke, at der findes et objekt, før det kan kaldes. Da main () er udgangspunktet for ethvert Java-program, er der faktisk ingen objekter, der allerede findes til at kalde det. Du kunne, hvis du har lyst til at have et program, der konstant kalder sig selv, gøre dette:
offentlig klasse StaticExample {
public static void main (String [] args) {
String [] s = {"random", "string"};
StaticExample.main (s);
}
}
Ikke særlig nyttigt, men læg mærke til, hvordan hovedmetoden () kan kaldes uden et eksempel på en StaticExample-klasse.
Hvad er et statisk felt?
Statiske felter er også kendt som klassefelter. Det er simpelthen felter, der har den statiske ændring i deres erklæringer. Lad os for eksempel gå tilbage til vareklassen og tilføje et statisk felt:
offentlig klasse vare {
// statisk felt unikId
privat statisk int unikId = 1;
privat int-artikelId;
privat strengstreng vare;
offentlig vare (strengnavn)
{
this.itemName = itemName;
itemId = unikId;
UniqueID ++;
}
}
Felterne itemId og itemName er normale ikke-statiske felter. Når der oprettes en forekomst af en vareklasse, vil disse felter have værdier, der er indeholdt i dette objekt. Hvis der oprettes et andet elementobjekt, har det også felter itemId og itemName til lagring af værdier.
Det unikke statiske felt indeholder imidlertid en værdi, der vil være den samme på tværs af alle elementobjekter. Hvis der er 100 elementobjekter, vil der være 100 tilfælde af felterne itemId og itemName, men kun et unikt statisk felt.
I ovenstående eksempel bruges unik id til at give hvert elementobjekt et unikt nummer. Dette er let at gøre, hvis hvert element-objekt, der oprettes, tager den aktuelle værdi i det statiske unikkeId og derefter øger det med et. Brug af et statisk felt betyder, at hvert objekt ikke behøver at vide om de andre objekter for at få en unik id. Dette kan være nyttigt, hvis du ville vide, i hvilken rækkefølge elementobjekterne blev oprettet.
Hvad er en statisk konstant?
Statiske konstanter er nøjagtigt som statiske felter, bortset fra at deres værdier ikke kan ændres. I feltdeklarationen er endelige og statisk modifikatorer bruges begge. F.eks. Bør vareklassen muligvis indføre en begrænsning af længden på varenavnet. Vi kunne oprette en statisk konstant maxItemNameLength:
offentlig klasse vare {
privat statisk int id = 1;
offentlig statisk endelig int maxItemNameLength = 20;
privat int-artikelId;
privat strengstreng vare;
offentlig vare (strengnavn)
{
if (itemName.length ()> maxItemNameLength)
{
this.itemName = itemName.substring (0,20);
}
andet
{
this.itemName = itemName;
}
itemId = id;
id ++;
} }
Som med statiske felter er statiske konstanter forbundet med klassen snarere end et individuelt objekt:
offentlig klasse StaticExample {
public static void main (String [] args) {
Vare catFood = ny vare ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
}
}
Der er to vigtige ting at bemærke om den statiske maxItemNameLength-konstant:
- Det erklæres som et offentligt felt. Generelt er det en dårlig idé at offentliggøre et felt i enhver klasse, du designer, men i dette tilfælde betyder det ikke noget. Værdien på konstanten kan ikke ændres.
- Den statiske konstant bruges fra klassens navn Element, ikke et Element-objekt.
Statiske konstanter kan ses i hele Java API. F.eks heltal indpakning klasse har to, der gemmer maksimum- og minimumsværdierne et int datatype kan få:
System.out.println ("Den maksimale værdi for int er:" + Heltal. MAX_VALUE);
System.out.println ("Min værdien for int er:" + Heltal. MIN_VALUE);
Produktion:
Den maksimale værdi for int er: 2147483647
Min værdien for int er: -2147483648