Понякога е полезно да имате стойности, които се споделят във всички инстанции на определен клас. Статични полета и статични константи активирайте този тип споделяне чрез принадлежност към клас а не към действителните обекти.
Статичният модификатор
Обикновено полета и методи, дефинирани в клас, могат да се използват само когато е създаден обект от този тип клас. Например, помислете за прост клас предмет, който следи стоките в магазина:
Публикация клас {
private String itemName;
публичен артикул (String itemName)
{
this.itemName = itemName;
}
public String getItemName ()
{
връщане itemName;
}
}
За да можем да използваме метода getItemName (), първо трябва да създадем обект Item, в този случай catFood:
публична класа StaticExample {
public static void main (String [] args) {
Item catFood = нов елемент ("Whiskas");
System.out.println (catFood.getItemName ());
}
}
Ако обаче статичният модификатор е включен в декларация на поле или метод, нито един екземпляр от класа не е необходими за използване на полето или метода - те са свързани с класа, а не от индивид обект. Ако погледнете отново горния пример, ще видите, че статичният модификатор вече се използва в
основен декларация за метод:обществен статичен void main (String [] args) {
Най- основен метод е статичен метод това не изисква обект да съществува, преди да може да бъде извикан. Тъй като main () е отправна точка за всяко Java приложение, всъщност вече няма обекти, които да го наричат. Бихте могли, ако се почувствате като да имате програма, която непрекъснато се обажда, да направите това:
публична класа StaticExample {
public static void main (String [] args) {
String [] s = {"случаен", "string"};
StaticExample.main (s);
}
}
Не е много полезно, но забележете как може да се извика методът main () без екземпляр от клас StaticExample.
Какво е статично поле?
Статичните полета също са известни като класови полета. Те са просто полета, които имат статичния модификатор в декларациите си. Например, да се върнем към класа Item и да добавим статично поле:
Публикация клас {
// статично поле uniqueId
частен статичен int uniqueId = 1;
private int itemId;
private String itemName;
публичен артикул (String itemName)
{
this.itemName = itemName;
itemId = uniqueId;
UNIQUEID ++;
}
}
Полетата itemId и itemName са нормални нестатични полета. Когато се създаде екземпляр от клас елемент, тези полета ще имат стойности, които се държат вътре в този обект. Ако бъде създаден друг обект на Item, той също ще има полетата itemId и itemName за съхранение на стойности.
Статичното поле jedinstveId обаче съдържа стойност, която ще бъде една и съща във всички обекти на Item. Ако има 100 обекта, ще има 100 екземпляра от полетата itemId и itemName, но само едно уникално статично поле.
В горния пример, uniqueId се използва, за да даде на всеки обект уникален номер. Това е лесно да се направи, ако всеки създаден обект Item вземе текущата стойност в статичното поле jedinstveId и след това го увеличава по едно. Използването на статично поле означава, че всеки обект няма нужда да знае за другите обекти, за да получи а уникален идентификационен номер. Това може да бъде полезно, ако искате да знаете реда, в който са създадени обектите.
Какво е статичен констант?
Статичните константи са точно като статични полета, с изключение на това, че техните стойности не могат да се променят. В полевата декларация финал и статичен се използват и модификатори. Например, може би класът Item трябва да наложи ограничение на дължината на itemName. Бихме могли да създадем статична константа maxItemNameLength:
Публикация клас {
частен статичен int id = 1;
публичен статичен финал int maxItemNameLength = 20;
private int itemId;
private String itemName;
публичен артикул (String itemName)
{
ако (itemName.length ()> maxItemNameLength)
{
this.itemName = itemName.substring (0,20);
}
още
{
this.itemName = itemName;
}
itemId = id;
ID ++;
} }
Както при статичните полета, статичните константи са свързани с класа, а не с отделен обект:
публична класа StaticExample {
public static void main (String [] args) {
Item catFood = нов елемент ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
}
}
Има две важни неща, които трябва да забележите за статичната константа maxItemNameLength:
- Обявен е за публично поле. Като цяло е лоша идея да направите публично поле на публика във всеки клас, който проектирате, но в този случай няма значение. Стойността на константата не може да бъде променена.
- Статичната константа се използва от името на клас Item, а не обект от Item.
Статичните константи могат да се видят в целия Java API. Например, the цяло число клас обвивка има две, които съхраняват максималните и минималните стойности int тип данни мога да имам:
System.out.println ("Максималната стойност за int е:" + Integer. MAX_VALUE);
System.out.println ("Минималната стойност за int е:" + Integer. MIN_VALUE);
изход:
Максималната стойност за int е: 2147483647
Минималната стойност за int е: -2147483648