Det kan finnas tillfällen då det är användbart att ha värden som delas över alla instanser av en viss klass. Statiska fält och statiska konstanter aktivera den här typen av delning genom att tillhöra klass och inte till de faktiska föremålen.
Den statiska modifieraren
Normalt kan fält och metoder som definieras i en klass endast användas när ett objekt av den klasstypen har skapats. Tänk till exempel på en enkel artikelklass som håller reda på varor i en butik:
public class artikel {
privat String artikelnamn;
public artikel (String itemName)
{
this.itemName = itemName;
}
public String getItemName ()
{
return artikelnamn;
}
}
För att kunna använda metoden getItemName () måste vi först skapa ett objektobjekt, i detta fall catFood:
public class StaticExample {
public static void main (String [] args) {
Artikel catFood = ny artikel ("Whiskas");
System.out.println (catFood.getItemName ());
}
}
Men om den statiska modifieraren ingår i ett fält- eller metoddeklaration, är ingen instans av klassen krävs för att använda fältet eller metoden - de är kopplade till klassen och inte en individ objekt. Om du tittar tillbaka på exemplet ovan ser du att den statiska modifieraren redan används i
huvudmetoddeklaration:offentlig statisk void main (String [] args) {
De huvudmetod är en statisk metod som inte kräver att ett objekt existerar innan det kan kallas. Eftersom huvud () är utgångspunkten för alla Java-applikationer finns det faktiskt inga objekt som redan finns för att kalla det. Om du känner för att ha ett program som kontinuerligt kallar sig själv kan du göra detta:
public class StaticExample {
public static void main (String [] args) {
String [] s = {"random", "string"};
StaticExample.main (s);
}
}
Inte särskilt användbart, men lägg märke till hur huvudmetoden () kan kallas utan en instans av klass StaticExample.
Vad är ett statiskt fält?
Statiska fält är också kända som klassfält. Det är helt enkelt fält som har den statiska modifieraren i sina deklarationer. Låt oss till exempel gå tillbaka till artikelklassen och lägga till ett statiskt fält:
public class artikel {
// statisk fält unik ID
privat statisk int unikId = 1;
privat int-artikelId;
privat String artikelnamn;
public artikel (String itemName)
{
this.itemName = itemName;
itemId = uniqueId;
UNIQUEID ++;
}
}
Fälten itemId och itemName är normala icke-statiska fält. När en instans av en objektklass skapas kommer dessa fält att ha värden som finns inne i det objektet. Om ett annat objektobjekt skapas har det också fält itemId och itemName för att lagra värden.
Det statiska unikaId-fältet har emellertid ett värde som är detsamma för alla objektobjekt. Om det finns 100 objektobjekt kommer det att finnas 100 instanser av fälten itemId och itemName, men bara ett unikt statiskt fält.
I exemplet ovan används unik ID för att ge varje objektobjekt ett unikt nummer. Detta är lätt att göra om varje objektobjekt som skapas tar det aktuella värdet i det statiska unikaId-fältet och sedan ökar det med ett. Användningen av ett statiskt fält innebär att varje objekt inte behöver veta om de andra objekten för att få en unikt ID. Detta kan vara användbart om du ville veta i vilken ordning objektobjekten skapades.
Vad är en statisk konstant?
Statiska konstanter är exakt som statiska fält förutom att deras värden inte kan ändras. I fältdeklarationen, slutlig och statisk modifierare används båda. Till exempel kanske artikelklassen bör begränsa längden på artikelnamnet. Vi kan skapa en statisk konstant maxItemNameLängd:
public class artikel {
privat statisk int id = 1;
public static final int maxItemNameLength = 20;
privat int-artikelId;
privat String artikelnamn;
public artikel (String itemName)
{
if (itemName.length ()> maxItemNameLength)
{
this.itemName = itemName.substring (0,20);
}
annan
{
this.itemName = itemName;
}
artikelId = id;
id ++;
} }
Liksom med statiska fält, är statiska konstanter associerade med klassen snarare än ett individuellt objekt:
public class StaticExample {
public static void main (String [] args) {
Artikel catFood = ny artikel ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
}
}
Det finns två viktiga saker att lägga märke till den statiska konstanten maxItemNameLength:
- Det förklaras som ett offentligt fält. I allmänhet är det en dålig idé att offentliggöra ett fält i alla klasser du designar, men i det här fallet spelar det ingen roll. Värdet på konstanten kan inte ändras.
- Den statiska konstanten används från klassnamnet Objekt, inte ett Objektobjekt.
Statiska konstanter kan ses över Java API. Till exempel heltal omslagsklass har två som lagrar max- och minimivärdena ett int data typ kan ha:
System.out.println ("Maxvärdet för int är:" + heltal. MAX_VALUE);
System.out.println ("Minvärdet för int är:" + heltal. MIN_VALUE);
Produktion:
Maxvärdet för int är: 2147483647
Minvärdet för int är: -2147483648