1. Statikus változók

Amikor egy osztályt betöltünk a memóriába, azonnal létrejön egy statikus objektum . Ez az objektum statikus osztályváltozókat (statikus osztálymezőket) tárol. A statikus objektum akkor is létezik, ha az osztályból nem jött létre közönséges (nem statikus) objektum.

Amikor változókat deklarálunk egy osztályban, jelezzük, hogy csak egyszer jönnek-e létre, vagy minden objektumban legyenek ezeknek a változóknak külön példányai. Alapértelmezés szerint minden egyes objektumhoz minden változó új másolata jön létre.

Egy statikus változó az osztály statikus objektumához van kötve, és mindig van belőle egyetlen példány.

staticHa statikus változót szeretne létrehozni egy osztályban, a kulcsszót a neve elé kell írnia . A statikus változó deklarálásának általános formátuma a következő:

static Type name = value;

Ha egy statikus változóhoz nincs hozzárendelve kezdeti érték, akkor az alapértelmezett értékkel inicializálódik:

típus Alapértelmezett érték
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(ugyanaz, mint
0
)
boolean
false
Object
és bármilyen osztályt
null

Példák:

Kód jegyzet
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Egy osztályon belül a statikus változóira egyszerűen a nevük használatával hivatkozhatunk. De ahhoz, hogy egy másik osztályból hozzáférjen, az osztály nevét a statikus változó neve elé kell írnia.

ClassName.variable

Példa:

Változó Osztály Az osztályán kívüli változó elérése
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
A változó a private. Az osztályon kívül nem látható.
private static int count = 0;
Counter
A változó a private. Az osztályon kívül nem látható.
private static boolean flag;
Arithmetic
A változó a private. Az osztályon kívül nem látható.


2. Statikus és nem statikus változók közötti különbség

Egy osztály nem statikus (közönséges) változóit ugyanúgy deklaráljuk, mint a statikusakat, csak kulcsszó nélkül static.

Mi a különbség a közönséges változók és a statikus változók között?

Az osztály közönséges változói az osztály objektumaihoz (az osztály példányaihoz), míg a statikus változói az osztály statikus objektumához vannak kötve.

Ha egy osztálynak több példánya van, mindegyiknek megvan a saját másolata a nem statikus (közönséges) változókról. Egy osztály statikus változóit mindig a statikus objektum tárolja, és csak egyetlen példány létezik belőlük.

Egy osztály közönséges változóit (mezőit) csak akkor érheti el, ha van hivatkozása az osztály egy objektumára. És természetesen az osztály belső módszerei.

Példa:

Egy osztály mezőjének elérése objektumhivatkozás segítségével
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);
   }
}

A statikus változókat bárhonnan elérheti (a láthatósági módosítók elszámolása után): normál metódusokból, azonos osztályú statikus metódusokból, más osztályok metódusaiból stb.

Példa:

Egy osztály statikus mezőjének elérése objektumhivatkozás használata nélkül
public class DataInfo
{
   public static int value = 100;
}

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

Hogyan szerveződik a memória:

Tegyük fel, hogy van egy Personosztályunk 4 mezővel: kettő statikus, kettő pedig nem.

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

Közvetlenül az osztály betöltése után

Amikor a Java gép befejezte az Personosztály betöltését, a memória így fog kinézni:

Az első objektum létrehozása után

Ha létrehozunk egy Personobjektumot, akkor a kép a következő lesz:

A statikus és a nem statikus változók közötti különbség 2

Kérjük, vegye figyelembe, hogy bár mindkét objektumnak két változója van, ezek különböző változók: a közönséges objektumok szokásos változókkal, a statikus objektumok pedig statikus változókkal rendelkeznek.

Több tárgyra van szükségünk

Hozzunk létre még két Personobjektumot. A memória most így fog kinézni:

A statikus és a nem statikus változók közötti különbség 3

Kérjük, vegye figyelembe, hogy minden objektumnak megvannak a saját kor- és névváltozói.



static3. A módosító eltávolítása és hozzáadása

A statikustól a hétköznapiig

Mi történik, ha veszünk egy statikus változót, és a módosítójának eltávolításával közönségessé alakítjuk static? Például a static int sumváltozó.

A módosított kód így fog kinézni:

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

A memória most így néz ki:

A statikus és a nem statikus változók közötti különbség

A statikus változó eltűnt a statikus objektumból, és most minden közönséges objektumnak megvan a saját sumváltozója.

A hétköznapitól a statikusig

Megtehetjük az ellenkezőjét is: hozzáadjuk a staticmódosítót egy osztály közönséges változóihoz. Eltűnnek minden hétköznapi objektumról, és megjelennek a statikus objektumban. Tegyük fel, hogy a és változókat statikussá tesszük . agenameEzután a kód így fog kinézni:

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

És most a memória így fog kinézni:

A statikus módosító eltávolítása és hozzáadása