2011-08-16 42 views
23

Tôi hiện đang chuẩn bị S (O) CJP, với cuốn sách Bates Sierra &.Tại sao chúng ta sử dụng từ khóa cuối cùng với các lớp bên trong vô danh?

Giới thiệu về các lớp bên trong (phương thức cục bộ hoặc ẩn danh), chúng nói rằng chúng ta không thể truy cập các biến cục bộ vì chúng sống trên stack trong khi lớp sống trên đống và có thể được trả về bởi phương thức và sau đó cố gắng có truy cập vào các biến này nằm trên ngăn xếp nhưng không tồn tại nữa vì phương pháp đã kết thúc ...

Như chúng ta đã biết, chúng tôi có thể bỏ qua điều này bằng cách sử dụng từ khóa cuối cùng. Đây là những gì họ nói trong cuốn sách nhưng họ không thực sự giải thích hiệu ứng của từ khóa cuối cùng là gì ... Theo như tôi biết, việc sử dụng từ khóa cuối cùng trên một biến địa phương phương pháp không làm cho nó hoạt động trên heap ... Vậy lớp học sẽ có thể truy cập vào một biến cuối cùng mà vẫn còn tồn tại trên stack trong khi có thể không có ngăn xếp nhiều hơn nữa ???

Tôi đoán có một số loại "bản sao" của biến cục bộ cuối cùng này bên trong lớp bên trong. Vì giá trị không thể thay đổi, tại sao không nhân đôi thông tin này ... Ai đó có thể xác nhận điều này hoặc cho tôi biết nếu tôi đang thiếu gì đó không?

Trả lời

18

Trực giác của bạn là chính xác, vì biến cuối cùng là an toàn để tạo bản sao của nó. Tất nhiên đối với các kiểu tham chiếu, điều này có nghĩa là sao chép tham chiếu đến đối tượng chứ không phải đối tượng mà nó đề cập đến.

11

Trình biên dịch sử dụng thủ thuật tinh vi sao chép tham chiếu cuối cùng dưới bìa để cho lớp bên trong có được trường cuối cùng trong lớp ngoài. Việc sao chép là lý do tại sao trường phải là giá trị cuối cùng để giá trị không thay đổi.

Xem ví dụ: http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/

+0

Có nhưng trình biên dịch vẫn có thể sao chép biến ngay cả khi nó không phải là cuối cùng. Đoán của tôi là yêu cầu nó là cuối cùng làm cho mã rõ ràng hơn rằng nó sẽ không thay đổi. –

+2

Vấn đề - theo hiểu biết của tôi - là nếu bạn không yêu cầu nó là cuối cùng, bạn cần phải theo dõi cẩn thận hơn nhiều về việc xử lý việc này và cập nhật bất cứ khi nào biến bên ngoài thay đổi. Điều gì nếu bạn có nhiều trường hợp của lớp bên trong và tất cả chúng cần được cập nhật? –

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