2011-09-27 43 views
34

thể trùng lặp:
private final static attribute vs private final attributeBiến cuối cùng tĩnh trong Java

sự khác biệt giữa việc khai báo một biến như

static final int x = 5; 

hoặc

final int x = 5; 
là gì

Nếu tôi chỉ muốn biến là địa phương và không đổi (không thể thay đổi sau này)?

Cảm ơn

+2

Nếu đây là một biến (trái ngược với một trường), nó không thể tĩnh chút nào. – Thilo

+0

Điều này đã được thảo luận trước trong [câu hỏi này] (http://stackoverflow.com/questions/1415955/private-final-static-attribute-vs-private-final-attribute). –

+0

Đây không phải là bản sao như hiện được đánh dấu. Câu hỏi này là hỏi về việc sử dụng "tĩnh cuối cùng" với một biến phương thức cục bộ, câu hỏi được liên kết đang sử dụng nó như một biến lớp/đối tượng (bên ngoài bất kỳ định nghĩa phương thức nào). Tôi nghĩ rằng câu trả lời là sử dụng "cuối cùng" từ bên trong một phương pháp làm những gì người ta có thể mong đợi "tĩnh cuối cùng" để làm trong bối cảnh đó, hầu hết thời gian.Tuy nhiên, tôi tự hỏi nếu nó là một đối tượng thay vì một int, nếu mutability có thể tạo ra kết quả khác với trực giác này. Tôi chưa thử nghiệm điều này. Có ai biết không? – Apriori

Trả lời

31

Chỉ việc có hiệu lực cuối cùng sẽ có hiệu lực.

Tuyên bố tĩnh là làm cho nó một biến lớp, điều này sẽ được truy cập thông qua tên lớp <ClassName>.x.

5

Trong tuyên bố đầu tiên bạn xác định biến, mà phổ biến đối với tất cả các đối tượng (trường tĩnh lớp).

Trong câu lệnh thứ hai, bạn xác định biến, thuộc về từng đối tượng đã tạo (nhiều bản sao).

Trong trường hợp của bạn, bạn nên sử dụng giá trị đầu tiên.

29

Khai báo trường là 'cuối cùng' sẽ đảm bảo rằng trường là hằng số và không thể thay đổi. Sự khác biệt có trong việc sử dụng từ khóa 'tĩnh'.

Khai báo trường là tĩnh có nghĩa là nó được liên kết với loại và không phải với các phiên bản. tức là chỉ có một bản sao của trường sẽ có mặt cho tất cả các đối tượng và không phải là bản sao riêng lẻ cho từng đối tượng. Do đó, các trường tĩnh có thể được truy cập thông qua tên lớp.

Như bạn có thể thấy, yêu cầu của bạn là trường phải không đổi được đạt được trong cả hai trường hợp (tuyên bố trường là 'cuối cùng' và là 'cuối cùng tĩnh').

câu hỏi tương tự là private final static attribute vs private final attribute

Hy vọng nó giúp

3

Đối với các loại nguyên thủy, các 'thức tĩnh' sẽ là một tuyên bố thích hợp để khai báo một hằng số. Biến cuối cùng không tĩnh có ý nghĩa khi nó là một tham chiếu không đổi đối với một đối tượng. Trong trường hợp này, mỗi cá thể có thể chứa tham chiếu riêng của nó, như được hiển thị trong JLS 4.5.4.

Xem câu trả lời của Pavel để có câu trả lời đúng.

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