1. Статични променливи

Когато клас се зареди в паметта, незабавно се създава статичен обект . Този обект съхранява статични променливи на клас (статични полета на клас). Статичният обект съществува дори ако не са създадени обикновени (нестатични) обекти от класа.

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

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

За да създадете статична променлива в клас, трябва да напишете staticключовата дума преди нейното име. Общият формат за деклариране на статична променлива е:

static Type name = value;

Ако на статична променлива не е присвоена начална стойност, тя се инициализира със стойност по подразбиране:

Тип Стойност по подразбиране
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(същото като
0
)
boolean
false
Object
и всяHowви класове
null

Примери:

Код Забележка
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Вътре в даден клас можете да се обърнете към статичните му променливи просто като използвате техните имена. Но за да получите достъп до тях от друг клас, трябва да напишете името на класа преди името на статичната променлива.

ClassName.variable

Пример:

Променлива Клас Достъп до променлива извън нейния клас
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Променливата е private. Извън класа не се вижда.
private static int count = 0;
Counter
Променливата е private. Извън класа не се вижда.
private static boolean flag;
Arithmetic
Променливата е private. Извън класа не се вижда.


2. Разлика между статични и нестатични променливи

Нестатичните (обикновени) променливи на клас се декларират по същия начин като статичните, само без ключовата staticдума.

Каква е разликата между обикновените променливи и статичните променливи?

Обикновените променливи на клас са обвързани с обекти на класа (екземпляри на класа), докато статичните променливи са обвързани със статичния обект на класа.

Ако има няколко екземпляра на клас, всеки от тях има собствено копие на нестатичните (обикновени) променливи. Статичните променливи на даден клас винаги се съхраняват в неговия статичен обект и съществува само един екземпляр от тях.

Можете да получите достъп до обикновените променливи (полета) на клас само ако имате препратка към обект от класа. И вътре в методите на класа, разбира се.

Пример:

Достъп до поле от клас чрез препратка към обект
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

Можете да получите достъп до статични променливи отвсякъде (след отчитане на модификаторите на видимост): от обикновени методи, от статични методи от същия клас, от методи от други класове и т.н.

Пример:

Достъп до статично поле на клас без използване на препратка към обект
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Как е организирана паметта:

Да кажем, че имаме Personклас с 4 полета: две са статични и две не са.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Веднага след зареждане на класа

Когато Java машината приключи със зареждането на Personкласа, паметта ще изглежда така:

След създаването на първия обект

Ако създадем Personобект, тогава картината става следната:

Разлика между статични и нестатични променливи 2

Моля, имайте предвид, че въпреки че и двата обекта имат две променливи, това са различни променливи: обикновените обекти имат обикновени променливи, а статичният обект има статичните променливи.

Имаме нужда от повече обекти

Нека създадем още два Personобекта. Сега паметта ще изглежда така:

Разлика между статични и нестатични променливи 3

Моля, обърнете внимание, че всеки обект има своя собствена възраст и променливи за име.



3. Премахване и добавяне на staticмодификатора

От статично към обикновено

Какво се случва, ако вземем статична променлива и я превърнем в обикновена, като премахнем нейния staticмодификатор? Например променливата static int sum.

Модифицираният code ще изглежда така:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Сега паметта изглежда така:

Разлика между статични и нестатични променливи

Статичната променлива изчезна от статичния обект и сега всеки обикновен обект има своя собствена sumпроменлива.

От обикновено до статично

Можем да направим обратното: да добавим staticмодификатора към обикновени променливи на клас. Те ще изчезнат от всички обикновени обекти и ще се появят в статичния обект. Да предположим, че решим да направим променливите ageи nameстатични. Тогава codeът ще изглежда така:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

И сега паметта ще изглежда така:

Премахване и добавяне на статичен модификатор