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 staticnyckelordet 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
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(samma sak som
0
)
boolean
false
Object
och eventuella klasser
null

Exempel:

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

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
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Variabeln är private. Det syns inte utanför klassen.
private static int count = 0;
Counter
Variabeln är private. Det syns inte utanför klassen.
private static boolean flag;
Arithmetic
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
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 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
public class DataInfo
{
   public static int value = 100;
}

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

Hur minnet är organiserat:

Låt oss säga att vi har en Personklass 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 Personklassen kommer minnet att se ut så här:

Efter att ha skapat det första objektet

Om vi ​​skapar ett Personobjekt blir bilden så här:

Skillnad mellan statiska och icke-statiska variabler 2

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å Personobjekt. Nu kommer minnet att se ut så här:

Skillnad mellan statiska och icke-statiska variabler 3

Observera att varje objekt har sina egna ålders- och namnvariabler.



3. Ta bort och lägga till staticmodifieraren

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 staticmodifierare? 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:

Skillnad mellan statiska och icke-statiska variabler

Den statiska variabeln försvann från det statiska objektet, och nu har varje vanligt objekt sin egen sumvariabel.

Från vanligt till statiskt

Vi kan göra tvärtom: lägg till staticmodifieraren 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 ageoch namestatiska. 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:

Ta bort och lägga till den statiska modifieraren