2011-06-21 58 views
15

Giả như sau:Trong Java, có phải các biến được khai báo bên trong các phương thức tĩnh là tĩnh không?

 
private static boolean A() 
{ 
    int parsedUntil = 0; 
    ... 
    ... 
    ... 
} 

là parsedUntil coi là một biến tĩnh? Tôi nhận thấy rằng tôi không thể tuyên bố nó là tĩnh bên trong chức năng tĩnh này.

Câu hỏi tiếp theo: Tôi đọc rằng biến tĩnh sẽ chỉ được khởi tạo một lần. Điều đó có nghĩa là lần đầu tiên tôi gọi hàm A() giá trị sẽ được đặt thành 0, nhưng mỗi lần khác tôi gọi A(), hàng đó bị bỏ qua?

Trả lời

23

Không, đây không phải là biến tĩnh. Đó là một biến địa phương. Bất kỳ biến nào được khai báo trong một phương thức đều là biến cục bộ. Nếu bạn muốn biến tĩnh, bạn phải khai báo biến đó bên ngoài phương thức:

private static int parsedUntil = 0; 

Không có cách nào khai báo biến tĩnh chỉ có thể được sử dụng trong một phương thức.

+1

Đó là tất cả về phạm vi. Phạm vi là cục bộ cho phương thức, bất kể loại phương thức. – Robin

+2

@Robin: Không, đó là về cuộc đời. Trong các ngôn ngữ khác, "người dân địa phương tĩnh" có thể có một phạm vi đơn phương nhưng tuổi thọ tĩnh, đôi khi hữu ích; trong cả hai trường hợp, phạm vi là cục bộ cho phương thức, nhưng tuổi thọ là khác nhau. – configurator

6

không, A() là một phương pháp tĩnh, và parsedUntil là một biến cục bộ bên A.

Modifiers như static không có giá trị trong các biến cục bộ (chỉ final được phép afaik)

Follow-up câu hỏi: Tôi đọc rằng biến số tĩnh sẽ chỉ là được khởi tạo một lần.

đúng

Liệu đó có nghĩa là lần đầu tiên Tôi gọi hàm A() giá trị sẽ được thiết lập để không, nhưng mỗi lần khác tôi gọi A(), hàng đó là bỏ qua?

vì được phân tích cú phápTrong trường không phải là trường tĩnh, nhưng biến cục bộ trong phương pháp tĩnh, đây không phải là trường hợp.

+0

Nhưng điều đó có nghĩa là gì nếu tôi tuyên bố nó là cuối cùng trong hàm? Về các lớp tôi đọc rằng từ khóa cuối cùng có nghĩa là các hàm của một lớp như vậy, không thể bị quá tải bởi các lớp con. (Có lẽ các lớp như vậy thậm chí không thể được mở rộng ra sao !?) –

+0

trong biến địa phương, cuối cùng có nghĩa là biến không thể được gán lại –

5

static biến không thể khai báo cục bộ trong các phương thức - chúng chỉ có thể là thành viên của lớp và chúng được khởi tạo khi lớp được tải.

+0

Cảm ơn! Khi bạn nói rằng họ chỉ có thể là thành viên của một lớp tôi nhớ rằng tôi đã đọc và điều đó có ý nghĩa! –

1

Java không có biến cục bộ tĩnh như C hoặc C++, vì vậy bạn không bao giờ có thể có static int parsedUtil = 0;.

Vì vậy, không, parsedUtil không có nghĩa là "tĩnh". Giá trị của nó được khởi tạo là 0 mỗi khi phương thức được thực hiện.

+0

Biến cục bộ KHÔNG được khởi tạo trong Java. – Ian

+0

@Ian - Theo JLS 14.4.2: "* Nếu người khai báo [biến cục bộ] có bộ khởi tạo, bộ khởi tạo được đánh giá và giá trị của nó được gán cho biến. *" Đủ gần cho tôi;) –

+0

Điểm công bằng . Tuy nhiên, không giống như các biến trong lớp hoặc phạm vi cá thể Java thực hiện không khởi tạo bởi ** mặc định **. Đó là điểm tôi đã cố gắng thực hiện, mặc dù đọc lại câu trả lời của bạn tôi thấy nó không thực sự áp dụng trong trường hợp này. Lỗi của tôi. – Ian

1

Không, không phải là C.

được phân tích cú phápNội dung không tĩnh. Nó chỉ là một biến cục bộ. Bạn không thể khai báo biến tĩnh bên trong phương thức.

Về câu hỏi thứ hai - các biến tĩnh có thể được chỉ định bao nhiêu lần tùy thích. Bạn không thể chỉ gán lại các biến cuối cùng.

+0

Giải thích tuyệt vời về tĩnh vs cuối cùng, cảm ơn! –

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