Как работят статичните полета в Java

Понякога е полезно да имате стойности, които се споделят във всички инстанции на определен клас. Статични полета и статични константи активирайте този тип споделяне чрез принадлежност към клас а не към действителните обекти.

Статичният модификатор

Обикновено полета и методи, дефинирани в клас, могат да се използват само когато е създаден обект от този тип клас. Например, помислете за прост клас предмет, който следи стоките в магазина:

 Публикация клас {

 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 ());

 }

 } 

Ако обаче статичният модификатор е включен в декларация на поле или метод, нито един екземпляр от класа не е необходими за използване на полето или метода - те са свързани с класа, а не от индивид обект. Ако погледнете отново горния пример, ще видите, че статичният модификатор вече се използва в

instagram viewer
основен декларация за метод:

 обществен статичен 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