1. Statiske variable

Når en klasse indlæses i hukommelsen, oprettes et statisk objekt med det samme. Dette objekt gemmer statiske klassevariabler (statiske klassefelter). Det statiske objekt eksisterer, selvom der ikke er oprettet nogen almindelige (ikke-statiske) objekter i klassen.

Når vi erklærer variabler i en klasse, angiver vi, om de kun vil blive oprettet én gang, eller om der skal være forskellige forekomster af disse variable i hvert objekt. Som standard oprettes en ny kopi af hver variabel for hvert objekt.

En statisk variabel er bundet til klassens statiske objekt, og der er altid en enkelt forekomst af den.

For at oprette en statisk variabel i en klasse skal du skrive nøgleordet staticfør dets navn. Det generelle format til at erklære en statisk variabel er:

static Type name = value;

Hvis en statisk variabel ikke er tildelt en startværdi, initialiseres den med en standardværdi:

Type Standard værdi
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 Bemærk
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Inde i en klasse kan du henvise til dens statiske variabler blot ved at bruge deres navne. Men for at få adgang til dem fra en anden klasse, skal du skrive navnet på klassen før navnet på den statiske variabel.

ClassName.variable

Eksempel:

Variabel klasse Adgang til en variabel uden for dens klasse
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Variablen er private. Det er ikke synligt uden for klassen.
private static int count = 0;
Counter
Variablen er private. Det er ikke synligt uden for klassen.
private static boolean flag;
Arithmetic
Variablen er private. Det er ikke synligt uden for klassen.


2. Forskel mellem statiske og ikke-statiske variable

Ikke-statiske (almindelige) variable i en klasse erklæres på samme måde som statiske, kun uden nøgleordet static.

Hvad er forskellen mellem almindelige variable og statiske variable?

Almindelige variable i en klasse er bundet til klassens objekter (forekomster af klassen), mens statiske variable er bundet til klassens statiske objekt.

Hvis der er flere forekomster af en klasse, har hver af dem sin egen kopi af de ikke-statiske (almindelige) variable. Statiske variabler for en klasse er altid gemt i dets statiske objekt, og der findes kun en enkelt forekomst af dem.

Du kan kun få adgang til de almindelige variabler (felter) i en klasse, hvis du har en reference til et objekt i klassen. Og inde i klassens metoder, selvfølgelig.

Eksempel:

Adgang til et felt i en klasse ved hjælp af en objektreference
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å adgang til statiske variable hvor som helst (efter at have taget højde for synlighedsmodifikatorerne): fra almindelige metoder, fra statiske metoder af samme klasse, fra metoder fra andre klasser osv.

Eksempel:

Adgang til et statisk felt i en klasse uden at bruge en objektreference
public class DataInfo
{
   public static int value = 100;
}

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

Sådan er hukommelsen organiseret:

Lad os sige, at vi har en Personklasse med 4 felter: to er statiske og to er ikke.

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

Umiddelbart efter indlæsning af klassen

Når Java-maskinen er færdig med at indlæse Personklassen, vil hukommelsen se sådan ud:

Efter at have oprettet det første objekt

Hvis vi opretter et Personobjekt, bliver billedet dette:

Forskellen mellem statiske og ikke-statiske variable 2

Bemærk venligst, at selvom begge objekter har to variable, er disse forskellige variabler: de almindelige objekter har almindelige variabler, og det statiske objekt har de statiske variable.

Vi har brug for flere genstande

Lad os skabe to Personobjekter mere. Nu vil hukommelsen se sådan ud:

Forskellen mellem statiske og ikke-statiske variable 3

Bemærk venligst, at hvert objekt har sine egne alders- og navnevariabler.



3. Fjernelse og tilføjelse af staticmodifikatoren

Fra statisk til almindelig

Hvad sker der, hvis vi tager en statisk variabel og gør den til en almindelig variabel ved at fjerne dens staticmodifikator? For eksempel static int sumvariablen.

Den ændrede kode vil se sådan ud:

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

Nu ser hukommelsen sådan ud:

Forskellen mellem statiske og ikke-statiske variable

Den statiske variabel forsvandt fra det statiske objekt, og nu har hvert almindeligt objekt sin egen sumvariabel.

Fra almindelig til statisk

Vi kan gøre det modsatte: tilføje staticmodifikatoren til almindelige variable i en klasse. De vil forsvinde fra alle almindelige objekter og vises i det statiske objekt. Antag, at vi beslutter at gøre variablerne ageog namestatiske. Så vil koden se sådan ud:

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

Og nu vil hukommelsen se sådan ud:

Fjernelse og tilføjelse af den statiske modifikator