1. Статични променливи
Когато клас се зареди в паметта, незабавно се създава статичен обект . Този обект съхранява статични променливи на клас (статични полета на клас). Статичният обект съществува дори ако не са създадени обикновени (нестатични) обекти от класа.
Когато декларираме променливи в клас, ние посочваме дали те ще бъдат създадени само веднъж or трябва да има отделни екземпляри на тези променливи във всеки обект. По подразбиране се създава ново копие на всяка променлива за всеки обект.
Статичната променлива е обвързана със статичния обект на класа и винаги има единичен негов екземпляр.
За да създадете статична променлива в клас, трябва да напишете static
ключовата дума преди нейното име. Общият формат за деклариране на статична променлива е:
static Type name = value;
Ако на статична променлива не е присвоена начална стойност, тя се инициализира със стойност по подразбиране:
Тип | Стойност по подразбиране |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(същото като
) |
|
|
и всяHowви класове |
|
Примери:
Код | Забележка |
---|---|
|
|
|
|
|
|
|
|
|
Вътре в даден клас можете да се обърнете към статичните му променливи просто като използвате техните имена. Но за да получите достъп до тях от друг клас, трябва да напишете името на класа преди името на статичната променлива.
ClassName.variable
Пример:
Променлива | Клас | Достъп до променлива извън нейния клас |
---|---|---|
|
|
|
|
|
|
|
|
Променливата е private . Извън класа не се вижда. |
|
|
Променливата е private . Извън класа не се вижда. |
|
|
Променливата е private . Извън класа не се вижда. |
2. Разлика между статични и нестатични променливи
Нестатичните (обикновени) променливи на клас се декларират по същия начин като статичните, само без ключовата static
дума.
Каква е разликата между обикновените променливи и статичните променливи?
Обикновените променливи на клас са обвързани с обекти на класа (екземпляри на класа), докато статичните променливи са обвързани със статичния обект на класа.
Ако има няколко екземпляра на клас, всеки от тях има собствено копие на нестатичните (обикновени) променливи. Статичните променливи на даден клас винаги се съхраняват в неговия статичен обект и съществува само един екземпляр от тях.
Можете да получите достъп до обикновените променливи (полета) на клас само ако имате препратка към обект от класа. И вътре в методите на класа, разбира се.
Пример:
Достъп до поле от клас чрез препратка към обект |
---|
|
Можете да получите достъп до статични променливи отвсякъде (след отчитане на модификаторите на видимост): от обикновени методи, от статични методи от същия клас, от методи от други класове и т.н.
Пример:
Достъп до статично поле на клас без използване на препратка към обект |
---|
|
Как е организирана паметта:
Да кажем, че имаме 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
обект, тогава картината става следната:
Моля, имайте предвид, че въпреки че и двата обекта имат две променливи, това са различни променливи: обикновените обекти имат обикновени променливи, а статичният обект има статичните променливи.
Имаме нужда от повече обекти
Нека създадем още два Person
обекта. Сега паметта ще изглежда така:
Моля, обърнете внимание, че всеки обект има своя собствена възраст и променливи за име.
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;
}
И сега паметта ще изглежда така:
GO TO FULL VERSION