Trình biên dịch sẽ tự động tạo một hàm tạo cho lớp bên trong ẩn danh của bạn và chuyển biến cục bộ của bạn vào hàm tạo này.
Hàm tạo lưu giá trị này trong biến lớp (trường), cũng được đặt tên là i
, sẽ được sử dụng bên trong "đóng cửa".
Tại sao nó phải là cuối cùng? Vâng chúng ta hãy cùng khám phá tình hình ở nơi nó không phải là:
public class A {
public void method() {
int i = 0; // note: this is WRONG code
doStuff(new Action() {
public void doAction() {
Console.printf(i); // or whatever
}
});
i = 4; // A
// B
i = 5; // C
}
}
Trong tình huống Một lĩnh vực i
của Action
cũng cần phải được thay đổi, chúng ta hãy giả định này có thể: nó cần tham chiếu đến đối tượng Action
.
Giả sử trong trường hợp B, trường hợp này là Action
là Thu thập rác.
Hiện tại trong trường hợp C: cần một phiên bản Action
để cập nhật biến lớp học của nó, nhưng giá trị được GC. Nó cần phải "biết" nó GCed, nhưng đó là khó khăn.Vì vậy, để giữ cho việc triển khai máy ảo đơn giản hơn, các nhà thiết kế ngôn ngữ Java đã nói rằng nó phải là cuối cùng sao cho VM không cần một cách để kiểm tra xem một đối tượng có biến mất hay không và đảm bảo rằng biến đó không phải là sửa đổi, và rằng VM hoặc trình biên dịch không phải giữ tham chiếu của tất cả các tập quán của biến bên trong các lớp bên trong vô danh và các cá thể của chúng.
Thực ra, biến tổng hợp chứa bản sao của biến không được đặt tên là i. Tùy thuộc vào phiên bản của trình biên dịch bạn đang sử dụng, nó là "$ i" hoặc "+ i". –