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 staticforan 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
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(det samme som
0
)
boolean
false
Object
og eventuelle klasser
null

Eksempler:

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

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
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Variabelen er private. Det er ikke synlig utenfor klassen.
private static int count = 0;
Counter
Variabelen er private. Det er ikke synlig utenfor klassen.
private static boolean flag;
Arithmetic
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
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);
   }
}

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
public class DataInfo
{
   public static int value = 100;
}

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

Hvordan minne er organisert:

La oss si at vi har en Personklasse 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 Personklassen, vil minnet se slik ut:

Etter å ha opprettet det første objektet

Hvis vi lager et Personobjekt, blir bildet dette:

Forskjellen mellom statiske og ikke-statiske variabler 2

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 Personobjekter til. Nå vil minnet se slik ut:

Forskjellen mellom statiske og ikke-statiske variabler 3

Vær oppmerksom på at hvert objekt har sine egne alders- og navnevariabler.



3. Fjerne og legge til staticmodifikatoren

Fra statisk til vanlig

Hva skjer hvis vi tar en statisk variabel og gjør den om til en vanlig ved å fjerne dens staticmodifikator? For eksempel static int sumvariabelen.

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:

Forskjellen mellom statiske og ikke-statiske variabler

Den statiske variabelen forsvant fra det statiske objektet, og nå har hvert ordinære objekt sin egen sumvariabel.

Fra vanlig til statisk

Vi kan gjøre det motsatte: legg staticmodifikatoren 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 ageog namestatiske. 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:

Fjerne og legge til den statiske modifikatoren