1. Biến tĩnh

Khi một lớp được tải vào bộ nhớ, một đối tượng tĩnh được tạo ngay lập tức. Đối tượng này lưu trữ các biến lớp tĩnh (các trường lớp tĩnh). Đối tượng tĩnh tồn tại ngay cả khi không có đối tượng thông thường (không tĩnh) nào của lớp được tạo.

Khi chúng tôi khai báo các biến trong một lớp, chúng tôi cho biết liệu chúng sẽ được tạo chỉ một lần hay liệu có nên có các phiên bản riêng biệt của các biến này trong mỗi đối tượng hay không. Theo mặc định, một bản sao mới của mỗi biến được tạo cho mỗi đối tượng.

Một biến tĩnh được liên kết với đối tượng tĩnh của lớp và luôn có một thể hiện duy nhất của nó.

Để tạo một biến tĩnh trong một lớp, bạn cần viết statictừ khóa trước tên của nó. Định dạng chung để khai báo một biến tĩnh là:

static Type name = value;

Nếu một biến tĩnh không được gán giá trị ban đầu, nó sẽ được khởi tạo với giá trị mặc định:

Kiểu Giá trị mặc định
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(điều tương tự như
0
)
boolean
false
Object
và bất kỳ lớp học
null

Ví dụ:

Mã số Ghi chú
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Bên trong một lớp, bạn có thể tham chiếu đến các biến tĩnh của nó đơn giản bằng cách sử dụng tên của chúng. Nhưng để truy cập chúng từ một lớp khác, bạn cần viết tên của lớp trước tên của biến tĩnh.

ClassName.variable

Ví dụ:

Biến đổi Lớp học Truy cập một biến bên ngoài lớp của nó
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Biến là private. Nó không thể nhìn thấy bên ngoài lớp học.
private static int count = 0;
Counter
Biến là private. Nó không thể nhìn thấy bên ngoài lớp học.
private static boolean flag;
Arithmetic
Biến là private. Nó không thể nhìn thấy bên ngoài lớp học.


2. Sự khác biệt giữa biến tĩnh và biến tĩnh

Các biến không tĩnh (thông thường) của một lớp được khai báo giống như các biến tĩnh, chỉ khác là không có từ statickhóa.

Sự khác biệt giữa biến thông thường và biến tĩnh là gì?

Các biến thông thường của một lớp được liên kết với các đối tượng của lớp (các thể hiện của lớp), trong khi các biến tĩnh được liên kết với đối tượng tĩnh của lớp.

Nếu có nhiều phiên bản của một lớp, mỗi phiên bản có bản sao riêng của các biến không tĩnh (thông thường). Các biến tĩnh của một lớp luôn được lưu trữ trong đối tượng tĩnh của nó và chỉ tồn tại một thể hiện duy nhất của chúng.

Bạn chỉ có thể truy cập các biến (trường) thông thường của một lớp nếu bạn có một tham chiếu đến một đối tượng của lớp đó. Và tất nhiên là các phương thức bên trong của lớp.

Ví dụ:

Truy cập một trường của một lớp bằng tham chiếu đối tượng
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);
   }
}

Bạn có thể truy cập các biến tĩnh từ bất cứ đâu (sau khi tính đến các công cụ sửa đổi khả năng hiển thị): từ các phương thức thông thường, từ các phương thức tĩnh của cùng một lớp, từ các phương thức của các lớp khác, v.v.

Ví dụ:

Truy cập trường tĩnh của một lớp mà không sử dụng tham chiếu đối tượng
public class DataInfo
{
   public static int value = 100;
}

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

Cách tổ chức bộ nhớ:

Giả sử chúng ta có một Personlớp với 4 trường: hai trường tĩnh và hai trường không.

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

Ngay sau khi tải lớp

Khi máy Java tải xong Personlớp, bộ nhớ sẽ như sau:

Sau khi tạo đối tượng đầu tiên

Nếu chúng ta tạo một Personđối tượng, thì bức tranh sẽ trở thành thế này:

Sự khác biệt giữa các biến tĩnh và không tĩnh 2

Xin lưu ý rằng mặc dù cả hai đối tượng đều có hai biến, nhưng đây là những biến khác nhau: đối tượng thông thường có biến thông thường và đối tượng tĩnh có biến tĩnh.

Chúng ta cần nhiều đối tượng hơn

Hãy tạo thêm hai Personđối tượng. Bây giờ bộ nhớ sẽ trông như thế này:

Sự khác biệt giữa các biến tĩnh và không tĩnh 3

Xin lưu ý rằng mỗi đối tượng có biến tuổi và tên riêng.



3. Loại bỏ và thêm staticbổ ngữ

Từ tĩnh đến bình thường

Điều gì xảy ra nếu chúng ta lấy một biến tĩnh và biến nó thành một biến bình thường bằng cách loại bỏ staticbộ sửa đổi của nó? Ví dụ, static int sumbiến.

Mã sửa đổi sẽ trông như thế này:

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

Bây giờ bộ nhớ trông như thế này:

Sự khác biệt giữa các biến tĩnh và không tĩnh

Biến tĩnh biến mất khỏi đối tượng tĩnh và bây giờ mỗi đối tượng thông thường có sumbiến riêng.

Từ bình thường đến tĩnh

Chúng ta có thể làm ngược lại: thêm bộ staticsửa đổi vào các biến thông thường của một lớp. Chúng sẽ biến mất khỏi tất cả các đối tượng thông thường và sẽ xuất hiện trong đối tượng tĩnh. Giả sử chúng ta quyết định làm cho các biến agenametĩnh. Sau đó, mã sẽ trông như thế này:

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

Và bây giờ bộ nhớ sẽ trông như thế này:

Xóa và thêm công cụ sửa đổi tĩnh