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 static
từ 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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(điều tương tự như
) |
|
|
và bất kỳ lớp học |
|
Ví dụ:
Mã số | Ghi chú |
---|---|
|
|
|
|
|
|
|
|
|
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ó |
---|---|---|
|
|
|
|
|
|
|
|
Biến là private . Nó không thể nhìn thấy bên ngoài lớp học. |
|
|
Biến là private . Nó không thể nhìn thấy bên ngoài lớp học. |
|
|
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ừ static
khó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 |
---|
|
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 |
---|
|
Cách tổ chức bộ nhớ:
Giả sử chúng ta có một Person
lớ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 Person
lớ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:
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:
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 static
bổ 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ỏ static
bộ sửa đổi của nó? Ví dụ, static int sum
biế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:
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ó sum
biế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ộ static
sử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 age
và name
tĩ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:
GO TO FULL VERSION