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ść |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(taki sam jak
) |
|
|
i dowolne zajęcia |
|
Przykłady:
Kod | Notatka |
---|---|
|
|
|
|
|
|
|
|
|
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ą |
---|---|---|
|
|
|
|
|
|
|
|
Zmienna private nie jest widoczna poza klasą |
|
|
Zmienna private nie jest widoczna poza klasą |
|
|
Zmienna private nie 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 |
---|
|
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 |
---|
|
Urządzenie w pamięci:
Powiedzmy, że mamy klasę Person
z 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:
Po utworzeniu pierwszego obiektu
Jeśli stworzymy obiekt klasy Person
, obraz będzie wyglądał tak
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:
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:
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 age
ró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:

GO TO FULL VERSION