2009-05-17 15 views
23

chênh lệch giữa trong những điều khoản sau đâyChuỗi và Final

String name = "Tiger"; 

final String name ="Tiger"; 

Mặc dù lớp Stringfinal lớp, tại sao chúng ta cần phải tạo ra một chuỗi biến "CONSTANT" như cuối cùng là gì?

+4

Đó là tham chiếu đến chuỗi được làm thức ở đây, không phải là chuỗi riêng của mình. –

Trả lời

48

final trong ngữ cảnh này có nghĩa là biến name chỉ có thể được chỉ định một lần. Gán một đối tượng khác nhau String cho nó một lần nữa dẫn đến một lỗi biên dịch.

Tôi nghĩ rằng nguồn gốc của sự nhầm lẫn ở đây là từ khóa final thể được sử dụng trong những bối cảnh khác nhau:

  • lớp cuối cùng: Lớp không thể được subclassed.
  • phương thức cuối cùng: Phương pháp không thể bị ghi đè.
  • biến cuối cùng: Biến chỉ có thể được chỉ định một lần.

Xem bài viết trên Wikipedia số final in Java để biết ví dụ về từng trường hợp.

+0

Hãy nhớ 'cuối cùng' cũng là về xuất bản an toàn cho các chủ đề khác, mặc dù (xem câu trả lời của tôi dưới đây). –

1

Bạn đang bối rối bất biến với kết quả cuối cùng.

Chuỗi, như Integer và Long, là một lớp không thay đổi trong đó dữ liệu nội bộ được bảo vệ khỏi sửa đổi thông qua đóng gói.

Tuy nhiên, như Ayman đã nói, cuối cùng đề cập đến con trỏ tới chuỗi.

2

Hãy nhớ rằng Java final keyword phục vụ hai mục đích trong trường hợp này:

  • nó có nghĩa là tài liệu tham khảo không thể được thiết lập để một String-- ví dụ: bạn có thể không sau đó làm "name = ...";
  • nhưng điều quan trọng là nó có nghĩa là tài liệu tham khảo được công bố một cách chính xác để đề khác (xem bài viết liên quan để biết thêm chi tiết, hoặc làm việc như Goetz et al, "Java Concurrency in Practice".
+0

Yup, ngữ nghĩa cuối cùng là rất quan trọng trong các ứng dụng đồng thời, không phải như vậy trong các ứng dụng Java bình thường, bởi vì các lập trình viên Java có xu hướng nắm lấy sự biến đổi. – egaga

4

"cuối cùng "có nghĩa là những thứ khác nhau trong hai trường hợp.

lớp java.lang.String là cuối cùng. điều này có nghĩa bạn không thể kế thừa từ nó.

biến 'tên' là cuối cùng, có nghĩa là bạn có thể' t thay đổi nó để trỏ đến một thể hiện khác của String. không phải là một hằng số, bởi vì bạn có thể đọc nó ở hai thời điểm khác nhau và nhận được các giá trị khác nhau.

Khi điều đó xảy ra, các đối tượng chuỗi Java cũng không thay đổi. Điều này có nghĩa rằng bạn không thể sửa đổi giá trị mà một đối tượng String cụ thể đại diện. So sánh điều này với một mảng - bạn có thể thay thế phần tử đầu tiên của đối tượng mảng bằng một đối tượng khác, nhưng bạn không thể thay thế ký tự đầu tiên của đối tượng String bằng một char khác. Đây là lý do tại sao String.replace() trả về một chuỗi mới - nó không thể sửa đổi chuỗi cũ.

Một lý do mà String là cuối cùng là ngăn chặn một thể hiện của một lớp con của String, thực hiện hành vi có thể thay đổi, được truyền vào vị trí của một String.

Nhưng cho dù bạn có thể sửa đổi một đối tượng cụ thể và liệu bạn có thể gán một đối tượng khác cho một biến hay không, đó là các khái niệm hoàn toàn khác nhau. Một là thuộc tính của các đối tượng String và thuộc tính kia là thuộc tính của các biến String, là các tham chiếu đến các đối tượng String.

2

Hãy xem The final word on the final keyword.

String name = "scott"; 
name = "tiger"; // OK 

final String gender = "male"; 
gender = "female"; // won't compile you cannot reassign gender cause it's final 
0

Nếu một biến được đánh dấu là thức thì giá trị của biến mà không thể thay đổi tức là từ khóa cuối cùng khi sử dụng với một biến làm cho nó một hằng số. Và nếu bạn cố gắng thay đổi giá trị của biến đó trong suốt quá trình của chương trình, trình biên dịch sẽ cung cấp cho bạn một lỗi.

LƯU Ý: Nếu bạn đánh dấu biến của loại tham chiếu là cuối cùng, biến đó không thể tham chiếu đến bất kỳ đối tượng nào khác. Tuy nhiên, bạn có thể thay đổi nội dung của đối tượng, bởi vì chỉ tham chiếu chính nó là cuối cùng.

NGUỒN: Final Keyword in Java

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