Mohou nastat situace, kdy je užitečné mít hodnoty, které jsou sdíleny ve všech instancích určité třídy. Statická pole a statické konstanty povolit tento typ sdílení příslušností k třída a ne ke skutečným objektům.
Statický modifikátor
Pole a metody definované ve třídě lze normálně použít pouze v případě, že byl vytvořen objekt tohoto typu třídy. Zvažte například jednoduchou třídu položek, která sleduje zboží v obchodě:
položka veřejné třídy {
private String itemName;
veřejná položka (String itemName)
{
this.itemName = itemName;
}
public String getItemName ()
{
návrat itemName;
}
}
Abychom mohli použít metodu getItemName (), musíme nejprve vytvořit objekt Item, v tomto případě catFood:
veřejná třída StaticExample {
public static void main (String [] args) {
Item catFood = new Item ("Whiskas");
System.out.println (catFood.getItemName ());
}
}
Pokud je však statický modifikátor zahrnut do deklarace pole nebo metody, žádná instance třídy není nutné k použití pole nebo metody - jsou spojeny s třídou a ne s jednotlivcem objekt. Pokud se podíváte zpět na výše uvedený příklad, uvidíte, že statický modifikátor se již používá v
deklarace hlavní metody:veřejnost statický void main (String [] args) {
hlavní metoda je statická metoda to nevyžaduje objekt existovat dříve, než může být volán. Protože main () je výchozím bodem pro jakoukoli aplikaci Java, ve skutečnosti neexistují žádné objekty, které by ji nazvaly. Pokud byste chtěli mít program, který se neustále volá, můžete to udělat:
veřejná třída StaticExample {
public static void main (String [] args) {
String [] s = {"random", "string"};
StaticExample.main (s);
}
}
Není to příliš užitečné, ale všimněte si, jak lze volat metodu main () bez instance třídy StaticExample.
Co je to statické pole?
Statická pole se také nazývají pole třídy. Jsou to prostě pole, která mají ve svých prohlášeních statický modifikátor. Vraťme se například do třídy Item a přidáme statické pole:
položka veřejné třídy {
// statické pole uniqueId
private static int uniqueId = 1;
soukromý int itemId;
private String itemName;
veřejná položka (String itemName)
{
this.itemName = itemName;
itemId = uniqueId;
uniqueId ++;
}
}
Pole itemId a itemName jsou normální nestatická pole. Když je vytvořena instance třídy Item, budou mít tato pole hodnoty, které jsou drženy uvnitř daného objektu. Pokud je vytvořen jiný objekt Item, bude mít také pole itemId a itemName pro ukládání hodnot.
Statické pole uniqueId však obsahuje hodnotu, která bude stejná ve všech objektech položky. Pokud existuje 100 objektů objektů, bude existovat 100 instancí polí itemId a itemName, ale pouze jedno jedinečné pole staticId.
Ve výše uvedeném příkladu je uniqueId použito k tomu, aby každému objektu Item poskytlo jedinečné číslo. To je snadné, pokud každý vytvořený objekt položky vezme aktuální hodnotu do statického pole uniqueId a poté ji zvýší o jeden. Použití statického pole znamená, že každý objekt nemusí vědět o ostatních objektech, aby získal unikátní ID. To by mohlo být užitečné, pokud byste chtěli vědět, v jakém pořadí byly vytvořeny objekty položky.
Co je statická konstanta?
Statické konstanty jsou přesně jako statická pole s tou výjimkou, že jejich hodnoty nelze změnit. V polním prohlášení: finále a statický používají se modifikátory. Třída Item by například mohla uložit omezení délky názvu položky. Mohli bychom vytvořit statickou konstantu maxItemNameLength:
položka veřejné třídy {
soukromé statické int id = 1;
veřejná statická konečná int maxItemNameLength = 20;
soukromý int itemId;
private String itemName;
veřejná položka (String itemName)
{
if (itemName.length ()> maxItemNameLength)
{
this.itemName = itemName.substring (0,20);
}
jiný
{
this.itemName = itemName;
}
itemId = id;
id ++;
} }
Stejně jako u statických polí jsou statické konstanty spojeny s třídou spíše než s jednotlivým objektem:
veřejná třída StaticExample {
public static void main (String [] args) {
Item catFood = new Item ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
}
}
O statické konstantě maxItemNameLength si musíme všimnout dvou důležitých věcí:
- Je vyhlášeno jako veřejné pole. Obecně je špatný nápad zveřejnit pole v jakékoli třídě, kterou navrhujete, ale v tomto případě na tom nezáleží. Hodnotu konstanty nelze změnit.
- Statická konstanta se používá z názvu třídy Item, nikoli z objektu Item.
Statické konstanty lze vidět v celé Java API. Například celočíselná obálka třídy má dvě, které ukládají maximální a minimální hodnoty int datový typ může mít:
System.out.println ("Maximální hodnota pro int je:" + Integer. MAX_VALUE);
System.out.println ("Minimální hodnota pro int je:" + Integer. MIN_VALUE);
Výstup:
Maximální hodnota pro int je: 2147483647
Hodnota min pro int je: -2147483648