1. Statiska variabler
När en klass laddas in i minnet skapas ett statiskt objekt omedelbart. Detta objekt lagrar statiska klassvariabler (statiska klassfält). Det statiska objektet existerar även om inga vanliga (icke-statiska) objekt i klassen har skapats.
När vi deklarerar variabler i en klass anger vi om de kommer att skapas bara en gång, eller om det ska finnas distinkta instanser av dessa variabler i varje objekt. Som standard skapas en ny kopia av varje variabel för varje objekt.
En statisk variabel är bunden till klassens statiska objekt och det finns alltid en enda instans av den.
För att skapa en statisk variabel i en klass måste du skriva static
nyckelordet före dess namn. Det allmänna formatet för att deklarera en statisk variabel är:
static Type name = value;
Om en statisk variabel inte tilldelas ett initialt värde, initieras den med ett standardvärde:
Typ | Standardvärde |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(samma sak som
) |
|
|
och eventuella klasser |
|
Exempel:
Koda | Notera |
---|---|
|
|
|
|
|
|
|
|
|
Inuti en klass kan du referera till dess statiska variabler helt enkelt genom att använda deras namn. Men för att komma åt dem från en annan klass måste du skriva namnet på klassen före namnet på den statiska variabeln.
ClassName.variable
Exempel:
Variabel | Klass | Åtkomst till en variabel utanför dess klass |
---|---|---|
|
|
|
|
|
|
|
|
Variabeln är private . Det syns inte utanför klassen. |
|
|
Variabeln är private . Det syns inte utanför klassen. |
|
|
Variabeln är private . Det syns inte utanför klassen. |
2. Skillnad mellan statiska och icke-statiska variabler
Icke-statiska (vanliga) variabler i en klass deklareras på samma sätt som statiska, endast utan nyckelordet static
.
Vad är skillnaden mellan vanliga variabler och statiska variabler?
Vanliga variabler i en klass är bundna till objekt i klassen (instanser av klassen), medan statiska variabler är bundna till klassens statiska objekt.
Om det finns flera instanser av en klass, har var och en av dem sin egen kopia av de icke-statiska (vanliga) variablerna. Statiska variabler för en klass lagras alltid i dess statiska objekt och endast en enda instans av dem finns.
Du kan bara komma åt de vanliga variablerna (fälten) i en klass om du har en referens till ett objekt i klassen. Och klassens inre metoder förstås.
Exempel:
Åtkomst till ett fält i en klass med hjälp av en objektreferens |
---|
|
Du kan komma åt statiska variabler var som helst (efter att ha tagit hänsyn till synlighetsmodifierarna): från vanliga metoder, från statiska metoder av samma klass, från metoder från andra klasser, etc.
Exempel:
Åtkomst till ett statiskt fält i en klass utan att använda en objektreferens |
---|
|
Hur minnet är organiserat:
Låt oss säga att vi har en Person
klass med 4 fält: två är statiska och två är det inte.
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
Omedelbart efter att klassen laddats
När Java-maskinen har laddat klart Person
klassen kommer minnet att se ut så här:
Efter att ha skapat det första objektet
Om vi skapar ett Person
objekt blir bilden så här:
Observera att även om båda objekten har två variabler är dessa olika variabler: de vanliga objekten har vanliga variabler och det statiska objektet har de statiska variablerna.
Vi behöver fler föremål
Låt oss skapa ytterligare två Person
objekt. Nu kommer minnet att se ut så här:
Observera att varje objekt har sina egna ålders- och namnvariabler.
3. Ta bort och lägga till static
modifieraren
Från statisk till vanlig
Vad händer om vi tar en statisk variabel och gör den till en vanlig genom att ta bort dess static
modifierare? Till exempel variabeln static int sum
.
Den modifierade koden kommer att se ut så här:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
Nu ser minnet ut så här:
Den statiska variabeln försvann från det statiska objektet, och nu har varje vanligt objekt sin egen sum
variabel.
Från vanligt till statiskt
Vi kan göra tvärtom: lägg till static
modifieraren till vanliga variabler i en klass. De kommer att försvinna från alla vanliga objekt och visas i det statiska objektet. Anta att vi bestämmer oss för att göra variablerna age
och name
statiska. Då kommer koden att se ut så här:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
Och nu kommer minnet att se ut så här:
GO TO FULL VERSION