2010-05-16 38 views
9

Tôi đã đi qua các biến địa phương và khái niệm biến lớp.Biến cục bộ trong java

Nhưng tôi đã gặp khó khăn
"Tại sao chúng tôi không thể khai báo local variablesstatic"?

Đối với ví dụ
Giả sử chúng ta có một vở kịch() chức năng:

void play() 
{ 
    static int i=5; 
    System.out.println(i); 
} 

Nó mang lại cho tôi lỗi trong nhật thực: Illegal modifier for parameter i;

Tôi đã nghi ngờ điều này bởi vì các khái niệm sau đây Tôi đã đọc:

  1. biến bên trong phương pháp: phạm vi là tức là địa phương trong phương thức đó.
  2. Khi biến được khai báo là tĩnh, nó hiện diện cho toàn bộ lớp, tức là không cho đối tượng cụ thể.

Bất kỳ ai cũng có thể giúp tôi làm rõ khái niệm.

Cảm ơn.

Trả lời

7

Do phạm vi của các biến cục bộ bị giới hạn trong khối xung quanh. Đó là lý do tại sao họ không thể được gọi (không tĩnh, cũng không tĩnh), từ các lớp hoặc phương pháp khác.

Wikipedia nói về static biến địa phương (trong C++ ví dụ):

biến cục bộ tĩnh được khai báo bên trong một hàm, giống như biến cục bộ tự động. Chúng có cùng phạm vi với các biến cục bộ bình thường, chỉ khác nhau trong "thời lượng lưu trữ": bất kỳ giá trị nào mà hàm đưa vào biến cục bộ tĩnh trong một cuộc gọi vẫn sẽ xuất hiện khi hàm được gọi lại.

Điều đó không tồn tại trong Java. Và theo ý kiến ​​của tôi - cho tốt hơn.

+0

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

+0

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. –

+0

@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

1

Java không có biến tĩnh như C. Thay vào đó, vì mọi phương thức đều có một lớp (hoặc thể hiện của một lớp) liên kết với nó, các biến scoped liên tục được lưu trữ tốt nhất ở cấp đó (ví dụ: private hoặc static private lĩnh vực). Sự khác biệt thực sự duy nhất là các phương thức khác trong cùng một lớp có thể tham chiếu đến chúng; vì tất cả các phương thức đó đều bị ràng buộc vào một tệp duy nhất, nó không phải là một vấn đề lớn trong thực tế.

1

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à.)

+0

Tham khảo ghi chú của bạn: Theo như tôi biết, bạn cần khai báo phương thức Bar() là tĩnh vì các phương thức tĩnh có thể truy cập dữ liệu tĩnh. –

+0

@Marar: Điều đó có nghĩa là tôi phải khai báo biến 'bar' là tĩnh, không phải là phương thức' Bar() '; bạn đúng rằng các phương thức tĩnh chỉ có thể truy cập dữ liệu tĩnh, nhưng các phương thức mẫu cũng có thể truy cập dữ liệu tĩnh. –

Các vấn đề liên quan