1. Statiske variabler
Når en klasse lastes inn i minnet, opprettes et statisk objekt umiddelbart. Dette objektet lagrer statiske klassevariabler (statiske klassefelt). Det statiske objektet eksisterer selv om ingen vanlige (ikke-statiske) objekter av klassen er opprettet.
Når vi erklærer variabler i en klasse, angir vi om de vil bli opprettet bare én gang, eller om det skal være distinkte forekomster av disse variablene i hvert objekt. Som standard opprettes en ny kopi av hver variabel for hvert objekt.
En statisk variabel er bundet til klassens statiske objekt, og det er alltid en enkelt forekomst av den.
For å lage en statisk variabel i en klasse, må du skrive nøkkelordet static
foran navnet. Det generelle formatet for å deklarere en statisk variabel er:
static Type name = value;
Hvis en statisk variabel ikke er tildelt en startverdi, initialiseres den med en standardverdi:
Type | Standardverdi |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(det samme som
) |
|
|
og eventuelle klasser |
|
Eksempler:
Kode | Merk |
---|---|
|
|
|
|
|
|
|
|
|
Inne i en klasse kan du referere til dens statiske variabler ganske enkelt ved å bruke navnene deres. Men for å få tilgang til dem fra en annen klasse, må du skrive navnet på klassen før navnet på den statiske variabelen.
ClassName.variable
Eksempel:
Variabel | Klasse | Tilgang til en variabel utenfor klassen |
---|---|---|
|
|
|
|
|
|
|
|
Variabelen er private . Det er ikke synlig utenfor klassen. |
|
|
Variabelen er private . Det er ikke synlig utenfor klassen. |
|
|
Variabelen er private . Det er ikke synlig utenfor klassen. |
2. Forskjellen mellom statiske og ikke-statiske variabler
Ikke-statiske (ordinære) variabler for en klasse er deklarert på samme måte som statiske, bare uten nøkkelordet static
.
Hva er forskjellen mellom vanlige variabler og statiske variabler?
Vanlige variabler i en klasse er bundet til objekter i klassen (forekomster av klassen), mens statiske variabler er bundet til klassens statiske objekt.
Hvis det er flere forekomster av en klasse, har hver av dem sin egen kopi av de ikke-statiske (ordinære) variablene. Statiske variabler for en klasse er alltid lagret i dets statiske objekt, og bare en enkelt forekomst av dem eksisterer.
Du kan bare få tilgang til de ordinære variablene (feltene) til en klasse hvis du har en referanse til et objekt i klassen. Og klassens interne metoder, selvfølgelig.
Eksempel:
Tilgang til et felt i en klasse ved hjelp av en objektreferanse |
---|
|
Du kan få tilgang til statiske variabler fra hvor som helst (etter å ha tatt hensyn til synlighetsmodifikatorene): fra vanlige metoder, fra statiske metoder av samme klasse, fra metoder fra andre klasser, etc.
Eksempel:
Tilgang til et statisk felt i en klasse uten å bruke en objektreferanse |
---|
|
Hvordan minne er organisert:
La oss si at vi har en Person
klasse med 4 felt: to er statiske og to er det ikke.
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
Umiddelbart etter lasting av klassen
Når Java-maskinen er ferdig med å laste Person
klassen, vil minnet se slik ut:
Etter å ha opprettet det første objektet
Hvis vi lager et Person
objekt, blir bildet dette:
Vær oppmerksom på at selv om begge objektene har to variabler, er disse forskjellige variabler: de ordinære objektene har ordinære variabler, og det statiske objektet har de statiske variablene.
Vi trenger flere gjenstander
La oss lage to Person
objekter til. Nå vil minnet se slik ut:
Vær oppmerksom på at hvert objekt har sine egne alders- og navnevariabler.
3. Fjerne og legge til static
modifikatoren
Fra statisk til vanlig
Hva skjer hvis vi tar en statisk variabel og gjør den om til en vanlig ved å fjerne dens static
modifikator? For eksempel static int sum
variabelen.
Den endrede koden vil se slik ut:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
Nå ser minnet slik ut:
Den statiske variabelen forsvant fra det statiske objektet, og nå har hvert ordinære objekt sin egen sum
variabel.
Fra vanlig til statisk
Vi kan gjøre det motsatte: legg static
modifikatoren til vanlige variabler i en klasse. De vil forsvinne fra alle vanlige objekter og vises i det statiske objektet. Anta at vi bestemmer oss for å gjøre variablene age
og name
statiske. Da vil koden se slik ut:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
Og nå vil minnet se slik ut:
GO TO FULL VERSION