Nói chung, static
có nghĩa là "được liên kết với chính loại đó, chứ không phải là một thể hiện của loại."
Điều đó có nghĩa là bạn có thể tham chiếu một biến tĩnh mà không bao giờ tạo một thể hiện của loại và bất kỳ mã nào đề cập đến biến đó đều tham chiếu đến cùng một dữ liệu. So sánh điều này với một biến đối tượng: trong trường hợp đó, có một phiên bản độc lập của biến cho mỗi thể hiện của lớp. Ví dụ:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
in ra 10: y.instanceVariable
và x.instanceVariable
riêng biệt, bởi vì x
vày
đề cập đến các đối tượng khác nhau.
Bạn có thể tham khảo các thành viên tĩnh thông qua các tài liệu tham khảo, mặc dù đó là một ý tưởng tồi để làm như vậy. Nếu chúng ta đã làm:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
sau đó sẽ in ra 20 - chỉ có một biến, không phải một biến. Nó đã được rõ ràng hơn để viết này là:
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
Điều đó làm cho hành vi rõ ràng hơn nhiều. IDE hiện đại thường sẽ đề nghị thay đổi danh sách thứ hai thành thứ ba.
Không có lý do để có một khai báo nội tuyến khởi tạo giá trị như sau, vì mỗi trường hợp sẽ có NUMBER
một giá trị riêng nhưng luôn có cùng một giá trị (là bất biến và được khởi tạo bằng một chữ). Điều này giống với việc chỉ có một final static
biến cho tất cả các trường hợp.
private final int NUMBER = 10;
Do đó, nếu nó không thể thay đổi, không có điểm nào có một bản sao cho mỗi phiên bản.
Nhưng, nó có ý nghĩa nếu được khởi tạo trong một hàm tạo như thế này:
// No initialization when is declared
private final int number;
public MyClass(int n) {
// The variable can be assigned in the constructor, but then
// not modified later.
number = n;
}
Bây giờ, đối với mỗi trường hợp MyClass
, chúng ta có thể có một giá trị khác nhau nhưng không thay đổi number
.