1. Mga static na variable

Kapag ang isang klase ay na-load sa memorya ng isang static na bagay ay nilikha kaagad. Ang bagay na ito ay nag-iimbak ng mga static na variable ng klase (static na mga field ng klase). Ang static na bagay ay umiiral kahit na walang ordinaryong (non-static) na mga bagay ng klase ang nalikha.

Kapag nagdedeklara kami ng mga variable sa isang klase, ipinapahiwatig namin kung isang beses lang gagawin ang mga ito, o kung dapat may mga natatanging pagkakataon ng mga variable na ito sa bawat object. Bilang default, ang isang bagong kopya ng bawat variable ay nilikha para sa bawat bagay.

Ang isang static na variable ay nakatali sa static na object ng klase at palaging may isang pagkakataon nito.

Upang lumikha ng isang static na variable sa isang klase, kailangan mong isulat ang statickeyword bago ang pangalan nito. Ang pangkalahatang format para sa pagdedeklara ng isang static na variable ay:

static Type name = value;

Kung ang isang static na variable ay hindi nakatalaga ng isang paunang halaga, ito ay sinisimulan ng isang default na halaga:

Uri Default na halaga
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(katulad ng
0
)
boolean
false
Object
at anumang klase
null

Mga halimbawa:

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

Sa loob ng isang klase, maaari kang sumangguni sa mga static na variable nito sa pamamagitan lamang ng paggamit ng kanilang mga pangalan. Ngunit upang ma-access ang mga ito mula sa ibang klase, kailangan mong isulat ang pangalan ng klase bago ang pangalan ng static na variable.

ClassName.variable

Halimbawa:

Variable Klase Pag-access sa isang variable sa labas ng klase nito
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Ang variable ay private. Hindi ito nakikita sa labas ng klase.
private static int count = 0;
Counter
Ang variable ay private. Hindi ito nakikita sa labas ng klase.
private static boolean flag;
Arithmetic
Ang variable ay private. Hindi ito nakikita sa labas ng klase.


2. Pagkakaiba sa pagitan ng mga static at non-static na variable

Ang mga di-static (ordinaryo) na variable ng isang klase ay idineklara sa parehong paraan tulad ng mga static, kung wala lang ang statickeyword.

Ano ang pagkakaiba sa pagitan ng mga ordinaryong variable at static na variable?

Ang mga karaniwang variable ng isang klase ay nakatali sa mga bagay ng klase (mga pagkakataon ng klase), habang ang mga static na variable ay nakatali sa static na bagay ng klase.

Kung mayroong maraming mga pagkakataon ng isang klase, bawat isa sa kanila ay may sariling kopya ng mga hindi static (ordinaryong) variable. Ang mga static na variable ng isang klase ay palaging naka-imbak sa static na object nito at iisang instance lang ng mga ito ang umiiral.

Maa-access mo lang ang mga ordinaryong variable (mga patlang) ng isang klase kung mayroon kang reference sa isang object ng klase. At sa loob ng mga pamamaraan ng klase, siyempre.

Halimbawa:

Pag-access sa isang field ng isang klase gamit ang isang object reference
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);
   }
}

Maaari mong ma-access ang mga static na variable mula sa kahit saan (pagkatapos ng accounting para sa mga modifier ng visibility): mula sa mga ordinaryong pamamaraan, mula sa mga static na pamamaraan ng parehong klase, mula sa mga pamamaraan ng iba pang mga klase, atbp.

Halimbawa:

Pag-access sa isang static na field ng isang klase nang hindi gumagamit ng object reference
public class DataInfo
{
   public static int value = 100;
}

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

Paano nakaayos ang memorya:

Sabihin nating mayroon tayong Personklase na may 4 na field: dalawa ang static at dalawa ang hindi.

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

Kaagad pagkatapos i-load ang klase

Kapag natapos na ng Java machine ang pag-load ng Personklase, magiging ganito ang memorya:

Matapos malikha ang unang bagay

Kung lumikha tayo ng isang Personbagay, ang larawan ay magiging ganito:

Pagkakaiba sa pagitan ng mga static at non-static na variable 2

Pakitandaan na kahit na ang parehong mga bagay ay may dalawang mga variable, ang mga ito ay magkaibang mga variable: ang mga ordinaryong bagay ay may mga ordinaryong variable, at ang static na bagay ay may mga static na variable.

Kailangan namin ng higit pang mga bagay

Gumawa tayo ng dalawa pang Personbagay. Ngayon ang memorya ay magiging ganito:

Pagkakaiba sa pagitan ng mga static at non-static na variable 3

Pakitandaan na ang bawat bagay ay may sariling mga variable ng edad at pangalan.



3. Pag-alis at pagdaragdag ng staticmodifier

Mula static hanggang karaniwan

Ano ang mangyayari kung kukuha tayo ng static na variable at gagawin itong ordinaryo sa pamamagitan ng pag-alis ng staticmodifier nito? Halimbawa, ang static int sumvariable.

Ang binagong code ay magiging ganito:

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

Ngayon ang memorya ay ganito ang hitsura:

Pagkakaiba sa pagitan ng mga static at non-static na variable

Ang static na variable ay nawala mula sa static na bagay, at ngayon ang bawat ordinaryong bagay ay may sariling sumvariable.

Mula karaniwan hanggang static

Maaari nating gawin ang kabaligtaran: idagdag ang staticmodifier sa mga ordinaryong variable ng isang klase. Mawawala ang mga ito sa lahat ng ordinaryong bagay at lilitaw sa static na bagay. Ipagpalagay na nagpasya kaming gawing static ang agemga namevariable. Pagkatapos ang code ay magiging ganito:

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

At ngayon ang memorya ay magiging ganito:

Pag-alis at pagdaragdag ng static na modifier