Thành viên tĩnh (biến, hàm, v.v.) phục vụ người gọi của lớp, cho dù họ đang ở trong lớp hay bên ngoài lớp, để thực hiện các hàm và sử dụng biến mà không tham chiếu đến một cá thể cụ thể của lớp . Bởi vì điều này, khái niệm về một "địa phương tĩnh" không có ý nghĩa, vì sẽ không có cách nào để người gọi bên ngoài hàm tham chiếu đến biến (vì nó là cục bộ cho hàm đó).
Có một số ngôn ngữ (ví dụ như VB.NET) có khái niệm biến cục bộ "tĩnh", mặc dù thuật ngữ "tĩnh" không nhất quán được sử dụng trong trường hợp này; Các biến địa phương tĩnh VB.NET giống như các biến cá thể ẩn, trong đó các cuộc gọi tiếp theo trên cùng một cá thể sẽ có giá trị trước đó nguyên vẹn.Ví dụ
Public Class Foo
Public Sub Bar()
Static i As Integer
i = i + 1
Console.WriteLine(i)
End Sub
End Class
...
Dim f As New Foo()
Dim f2 as New Foo()
f.Bar() // Prints "1"
f.Bar() // Prints "2"
f2.Bar() // Prints "1"
Vì vậy, như bạn có thể thấy, từ khóa "tĩnh" không được sử dụng trong ý nghĩa OO truyền thống ở đây, vì nó vẫn còn cụ thể cho một ví dụ cụ thể của Foo
.
Vì hành vi này có thể gây nhầm lẫn (hoặc ít nhất là không trực quan), các ngôn ngữ khác như Java và C# ít linh hoạt hơn khi nói đến các khai báo biến. Tùy thuộc vào cách bạn muốn ứng xử hoạt động, bạn nên khai báo biến của mình dưới dạng biến mẫu hoặc biến tĩnh/lớp:
Nếu bạn muốn biến tồn tại ngoài phạm vi chức năng nhưng đặc biệt cho trường hợp duy nhất của lớp (như VB.NET không), sau đó tạo ra một biến Ví dụ:
public class Foo
{
private int bar;
public void Bar()
{
bar++;
System.out.println(bar);
}
}
Nếu bạn muốn nó có thể truy cập đến tất cả thể hiện của lớp (hoặc thậm chí không có một ví dụ), hãy nó static
:
public class Foo
{
private static int bar;
public static void Bar()
{
bar++;
System.out.println(bar);
}
}
(Lưu ý rằng tôi đã làm Bar()
tĩnh trong ví dụ cuối cùng, nhưng không có lý do gì phải là.)
Vâng, phạm vi trong cùng C hoặc C++, nhưng chúng cho phép biến tĩnh bên trong các hàm chỉ tốt . – doublep
Có! Trong C++, các biến tĩnh/lớp có thể được khai báo bên trong một phương thức. –
@doublep: vâng, nhưng Java không phải là C hoặc C++, không có lý do gì để nó hoạt động giống nhau trong Java. – Jesper