1. Zmienne statyczne

Gdy klasa jest ładowana do pamięci, natychmiast tworzony jest dla niej statyczny obiekt klasy . Ten obiekt przechowuje zmienne klasy statycznej (pola klasy statycznej). Obiekt klasy statycznej istnieje, nawet jeśli nie został utworzony żaden zwykły obiekt klasy.

Deklarując zmienne w klasie, wskazujemy, czy zmienne te zostaną utworzone tylko raz, czy też musimy utworzyć ich kopie dla każdego obiektu. Domyślnie dla każdego obiektu tworzona jest nowa kopia zmiennej.

Zmienna statyczna ( static ) jest powiązana z obiektem klasy statycznej i zawsze istnieje w jednej instancji.

Aby utworzyć statyczną zmienną klasy, poprzedź jej nazwę słowem kluczowym static. Ogólna postać deklaracji zmiennej statycznej jest następująca:

static Тип Nazwa = oznaczający;

Jeśli zmiennej statycznej nie jest przypisana wartość początkowa, jest ona inicjowana wartością domyślną:

Typ Domyślna wartość
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(taki sam jak
0
)
boolean
false
Object
i dowolne zajęcia
null

Przykłady:

Kod Notatka
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Możesz odwołać się do zmiennej statycznej w jej klasie po prostu przez nazwę. Jeśli wywołanie pochodzi z innej klasy, to przed nazwą zmiennej statycznej należy wpisać nazwę klasy.

NazwaКласса.переменная

Przykład:

Zmienny Klasa Dostęp do zmiennej poza klasą
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Zmienna privatenie jest widoczna poza klasą
private static int count = 0;
Counter
Zmienna privatenie jest widoczna poza klasą
private static boolean flag;
Arithmetic
Zmienna privatenie jest widoczna poza klasą


2. Różnica między zmiennymi statycznymi i niestatycznymi

Niestatyczne (zwykłe) zmienne klasy są deklarowane w taki sam sposób jak statyczne, tylko bez rozszerzenia static.

Jaka jest różnica między zmiennymi zwykłymi a statycznymi?

Zwykłe zmienne klasy są powiązane z obiektami swojej klasy (instancjami klasy), zmienne statyczne są powiązane z obiektem klasy statycznej.

Jeśli istnieje kilka instancji klasy, każda z nich ma własną kopię niestatycznych (zwykłych) zmiennych klasy. Zmienne klasy statycznej zawsze znajdują się wewnątrz obiektu klasy statycznej i istnieją tylko w jednej instancji.

Możesz uzyskać dostęp do zwykłych zmiennych klas (pól klas) tylko wtedy, gdy masz odwołanie do obiektu klasy. Cóż, lub w metodach w ramach tej samej klasy.

Przykład:

Dostęp do pola klasy przy użyciu odwołania do obiektu klasy
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);
   }
}

Możesz uzyskać dostęp do zmiennych statycznych z dowolnego miejsca (w tym modyfikatorów widoczności): ze zwykłych metod, z metod statycznych tej samej klasy, z metod innych klas itp.

Przykład:

Dostęp do pola statycznego klasy bez użycia odwołania do obiektu klasy
public class DataInfo
{
   public static int value = 100;
}

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

Urządzenie w pamięci:

Powiedzmy, że mamy klasę Personz 4 polami: dwa są statyczne, a dwa nie.

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

Zaraz po załadowaniu klasy

Gdy maszyna Java zakończy ładowanie klasy Person, w pamięci zobaczymy następujący obraz:

Różnica między zmiennymi statycznymi i niestatycznymi

Po utworzeniu pierwszego obiektu

Jeśli stworzymy obiekt klasy Person, obraz będzie wyglądał tak

Różnica między zmiennymi statycznymi i niestatycznymi 1

Należy pamiętać, że chociaż obiekty mają dwie zmienne, to są to różne zmienne: dla zwykłego obiektu - zwyczajne, dla obiektu statycznego - statyczne.

Potrzebujesz więcej przedmiotów

Stwórzmy jeszcze dwa obiekty, takie jak Person. Nowe zdjęcie będzie wyglądać tak:

Różnica między zmiennymi statycznymi i niestatycznymi 2

Zauważ, że każdy obiekt ma swoją własną zmienną wieku i nazwy.



3 Usuwanie i dodawanie modyfikatorastatic

Od statycznego do zwykłego

Co się stanie, jeśli weźmiemy zmienną statyczną i zmienimy ją w normalną: usuniemy z niej modyfikator static? Na przykład zmienna static int sum.

Zmodyfikowany kod będzie wyglądał następująco:

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

I w pamięci otrzymujemy ten obraz:

Usuwanie i dodawanie modyfikatora static

Zmienna statyczna zniknęła z obiektu statycznego, a każdy obiekt ma swoją własną zmienną sum.

Od normalnego do statycznego

Można też zrobić odwrotnie: dodać modyfikator przed zwykłymi zmiennymi klasowymi static, a wtedy znikną one ze wszystkich obiektów i pojawią się na obiekcie statycznym. Załóżmy, że zdecydowaliśmy się uczynić zmienne agerównież statycznymi name. Wtedy kod będzie wyglądał następująco:

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

I w pamięci otrzymujemy ten obraz:

Usuwanie i dodawanie modyfikatora static