1. Pembolehubah statik

Apabila kelas dimuatkan ke dalam memori objek statik dicipta serta-merta. Objek ini menyimpan pembolehubah kelas statik (medan kelas statik). Objek statik wujud walaupun tiada objek biasa (bukan statik) kelas telah dicipta.

Apabila kami mengisytiharkan pembolehubah dalam kelas, kami menunjukkan sama ada pembolehubah itu akan dibuat sekali sahaja atau sama ada perlu ada kejadian yang berbeza bagi pembolehubah ini dalam setiap objek. Secara lalai, salinan baharu setiap pembolehubah dibuat untuk setiap objek.

Pembolehubah statik terikat pada objek statik kelas dan sentiasa ada satu contoh sahaja.

Untuk mencipta pembolehubah statik dalam kelas, anda perlu menulis statickata kunci sebelum namanya. Format umum untuk mengisytiharkan pembolehubah statik ialah:

static Type name = value;

Jika pembolehubah statik tidak diberikan nilai awal, ia dimulakan dengan nilai lalai:

taip Nilai asal
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(perkara yang sama seperti
0
)
boolean
false
Object
dan mana-mana kelas
null

Contoh:

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

Di dalam kelas, anda boleh merujuk kepada pembolehubah statiknya hanya dengan menggunakan nama mereka. Tetapi untuk mengaksesnya dari kelas lain, anda perlu menulis nama kelas sebelum nama pembolehubah statik.

ClassName.variable

Contoh:

Pembolehubah Kelas Mengakses pembolehubah di luar kelasnya
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Pembolehubahnya ialah private. Ia tidak kelihatan di luar kelas.
private static int count = 0;
Counter
Pembolehubahnya ialah private. Ia tidak kelihatan di luar kelas.
private static boolean flag;
Arithmetic
Pembolehubahnya ialah private. Ia tidak kelihatan di luar kelas.


2. Perbezaan antara pembolehubah statik dan bukan statik

Pembolehubah bukan statik (biasa) kelas diisytiharkan dengan cara yang sama seperti pembolehubah statik, hanya tanpa kata statickunci.

Apakah perbezaan antara pembolehubah biasa dan pembolehubah statik?

Pembolehubah biasa kelas terikat pada objek kelas (contoh kelas), manakala pembolehubah statik terikat pada objek statik kelas.

Jika terdapat berbilang kejadian kelas, setiap daripadanya mempunyai salinan pembolehubah bukan statik (biasa) sendiri. Pembolehubah statik kelas sentiasa disimpan dalam objek statiknya dan hanya satu contoh sahaja wujud.

Anda boleh mengakses pembolehubah biasa (medan) kelas hanya jika anda mempunyai rujukan kepada objek kelas. Dan kaedah dalam kelas, sudah tentu.

Contoh:

Mengakses medan kelas menggunakan rujukan objek
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);
   }
}

Anda boleh mengakses pembolehubah statik dari mana-mana sahaja (selepas mengambil kira pengubah keterlihatan): daripada kaedah biasa, daripada kaedah statik kelas yang sama, daripada kaedah kelas lain, dsb.

Contoh:

Mengakses medan statik kelas tanpa menggunakan rujukan objek
public class DataInfo
{
   public static int value = 100;
}

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

Bagaimana memori disusun:

Katakan kita mempunyai Personkelas dengan 4 medan: dua adalah statik dan dua tidak.

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

Sejurus selepas memuatkan kelas

Apabila mesin Java telah selesai memuatkan Personkelas, memori akan kelihatan seperti ini:

Selepas mencipta objek pertama

Jika kita mencipta Personobjek, maka gambarnya menjadi ini:

Perbezaan antara pembolehubah statik dan bukan statik 2

Sila ambil perhatian bahawa walaupun kedua-dua objek mempunyai dua pembolehubah, ini adalah pembolehubah yang berbeza: objek biasa mempunyai pembolehubah biasa, dan objek statik mempunyai pembolehubah statik.

Kami memerlukan lebih banyak objek

Mari buat dua lagi Personobjek. Sekarang ingatan akan kelihatan seperti ini:

Perbezaan antara pembolehubah statik dan bukan statik 3

Sila ambil perhatian bahawa setiap objek mempunyai pembolehubah umur dan nama sendiri.



3. Mengalih keluar dan menambah staticpengubah suai

Dari statik kepada biasa

Apakah yang berlaku jika kita mengambil pembolehubah statik dan mengubahnya menjadi biasa dengan mengalih keluar pengubahnya static? Sebagai contoh, static int sumpembolehubah.

Kod yang diubah suai akan kelihatan seperti ini:

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

Sekarang ingatan kelihatan seperti ini:

Perbezaan antara pembolehubah statik dan bukan statik

Pembolehubah statik hilang daripada objek statik, dan kini setiap objek biasa mempunyai sumpembolehubah sendiri.

Dari biasa kepada statik

Kita boleh melakukan sebaliknya: tambah staticpengubah suai kepada pembolehubah biasa kelas. Mereka akan hilang daripada semua objek biasa dan akan muncul dalam objek statik. Katakan kita membuat keputusan untuk membuat agedan namepembolehubah statik. Kemudian kod akan kelihatan seperti ini:

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

Dan kini ingatan akan kelihatan seperti ini:

Mengalih keluar dan menambah pengubah statik