2012-07-05 69 views
35

Tại sao biến cuối cùng phải được khởi tạo trước khi hàm tạo hoàn thành?Tại sao biến cuối cùng phải được khởi tạo trước khi hàm tạo hoàn thành?

public class Ex 
{ 
    final int q; 
} 

Khi tôi biên dịch mã này tôi nhận được lỗi như

err này: biến q có thể không được khởi tạo

+0

Một tài sản của từ khóa thức là nó đảm bảo rằng một biến không thể thay đổi trạng thái sau khi nó đã được khởi tạo. Nó buộc người dùng khởi tạo khi nó được khai báo hoặc trong một hàm tạo. –

+1

Vui lòng xem [này] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4). – user1329572

+3

Trường 'final' phải được đặt một lần và chỉ một lần. Trình biên dịch chỉ có thể chắc chắn đây là trường hợp nếu nó được đặt trong một hàm tạo. –

Trả lời

2

Các modifier final ngăn chặn bạn từ changeing giá trị biến, do đó bạn có để khởi tạo nó, nơi bạn khai báo nó.

14

Bởi vì final ngăn bạn sửa đổi các biến, nhưng nó phải được khởi tạo tại một số điểm, và các nhà xây dựng là nơi thích hợp để làm như vậy.

Trong trường hợp của bạn, nó sẽ được gọi là blank final vì nó không được khởi tạo khi được khai báo.

0

Final modifier không cho phép change your variable value. Do đó, bạn cần gán giá trị cho nó ở một số nơi và constructor là nơi bạn phải thực hiện việc này trong trường hợp này.

0

Đặc tả ngôn ngữ chứa các đảm bảo cụ thể về các thuộc tính của các biến và trường cuối cùng, và một trong số đó là đối tượng được xây dựng đúng cách (nghĩa là đối tượng đã hoàn thành thành công) phải có tất cả trường mẫu cuối cùng được khởi tạo và hiển thị cho tất cả chuỗi . Do đó, trình biên dịch phân tích đường dẫn mã và yêu cầu bạn khởi tạo các trường đó.

11

Giá trị của biến số final chỉ có thể được đặt một lần. Hàm khởi tạo là nơi duy nhất trong mã cho một lớp mà bạn có thể đảm bảo điều này sẽ đúng; constructor chỉ được gọi một lần cho một đối tượng nhưng các phương thức khác có thể được gọi là bất kỳ số lần nào.

6

Từ khóa final áp dụng cho một lĩnh vực có một trong hai hiệu ứng:

  • trên một nguyên thủy, nó ngăn chặn các giá trị nguyên thủy không bị thay đổi (một int không thể thay đổi giá trị)
  • trên một đối tượng, nó ngăn cản "giá trị của biến", có nghĩa là, tham chiếu đến đối tượng, không bị thay đổi. Tức là, nếu bạn có số final HashMap<String,String> a, bạn sẽ chỉ có thể đặt một lần và bạn sẽ không thể thực hiện lại this.a=new HashMap<String,String>();, nhưng không có gì ngăn bạn thực hiện this.a.put("a","b"), vì điều đó không sửa đổi tham chiếu, chỉ nội dung của đối tượng.
9

Biến số final phải được khởi tạo tại khai báo hoặc trong hàm tạo.

Nếu nó chưa được khởi tạo khi hàm tạo trả về, nó có thể không bao giờ được khởi tạo và có thể vẫn là một biến chưa được khởi tạo. Trình biên dịch không thể chứng minh nó sẽ được khởi tạo, và do đó ném một lỗi.

Wikipedia excerpt này giải thích nó cũng:

Một biến cuối cùng chỉ có thể được khởi tạo một lần, hoặc thông qua một initializer hoặc một câu lệnh gán. Nó không cần phải được khởi tạo tại điểm khai báo: đây được gọi là biến "trống cuối cùng".Một biến mẫu trống cuối cùng của một lớp chắc chắn phải được gán ở cuối mỗi hàm tạo của lớp mà nó được khai báo; tương tự, một biến tĩnh cuối cùng trống phải được gán chắc chắn trong một trình khởi tạo tĩnh của lớp mà nó được khai báo: nếu không, một lỗi biên dịch sẽ xảy ra trong cả hai trường hợp. (Lưu ý: Nếu biến là một tài liệu tham khảo, điều này có nghĩa rằng biến thể không được tái ràng buộc để tham khảo đối tượng khác Nhưng đối tượng mà nó tham chiếu vẫn có thể thay đổi, nếu nó đã được ban có thể thay đổi..)

29

Các chính thức lý do là nó được xác định bởi Java Language Spefication 8.3.1.2:

Một instance variable thức trống phải được chắc chắn giao vào cuối mỗi constructor của lớp mà nó được khai báo; nếu không xảy ra lỗi biên dịch.

Trống cuối cùng là biến cuối cùng có tuyên bố thiếu trình khởi tạo (tức là những gì bạn mô tả).

+0

Hàm tạo mặc định phải được khởi tạo thành giá trị mặc định đúng không? Nó không cho các biến không phải cuối cùng nhưng tại sao không cho các biến cuối cùng? – Sunil

+2

Câu trả lời này chỉ giữ lại hành vi mà OP được đề cập đến. Nó không nêu lý do cho hành vi, đó là câu hỏi mà OP hỏi. – ineedahero

+0

@ineedahero Tôi nghĩ rằng tôi đã trả lời câu hỏi của op: bởi vì ngôn ngữ được định nghĩa theo cách đó. Tại sao nó được xác định theo cách đó là một câu hỏi cho bất cứ ai đã viết các đặc điểm kỹ thuật và trừ khi anh ta hoặc cô ấy là xung quanh chúng ta chỉ có thể làm công việc đoán ... – assylias

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