Để truy cập trường x của lớp ngoài A từ lớp bên trong B, tôi nhận ra rằng bạn có thể sử dụng "A.this.x". Nhưng nếu lớp bên ngoài cũng vô danh thì sao? Ví dụ:Truy cập trường ngoài của lớp ẩn danh từ một lớp ẩn danh bên trong
public class Main1 {
public static void main(String[] args) {
Comparable c1 = new Comparable(){
int x = 3;
public int compareTo(Object o) {
Comparable c2 = new Comparable(){
int x = 4;
public int compareTo(Object o) {
return x; // <-- THIS LINE
}
};
return c2.compareTo(o);
}
};
System.out.println(c1.compareTo(null));
}
}
Khi mã này được chạy, giá trị 4 được in vì đó là giá trị của trường c2 x. Tuy nhiên, tôi muốn thay đổi dòng được đánh dấu "LINE NÀY" để nó trả về x của lớp ngoài (có nghĩa là, trường c1 x, với giá trị 3). Nếu các lớp bên ngoài (có nghĩa là, lớp c1 của) là một tên lớp A, sau đó tôi có thể thay thế
return x;
với
return A.this.x;
Nhưng kể từ khi lớp bên ngoài cũng là vô danh, tôi không có một tên để sử dụng.
Câu hỏi: Có cách nào để sửa đổi dòng có nhãn "DÒNG NÀY" để nó đề cập đến trường c1 x thay vì của c2, mà không thay đổi các lớp ẩn danh thành các lớp được đặt tên?
Tôi nhận ra mã này thực sự xấu và không phải là kiểu lập trình tốt để sử dụng các lớp ẩn danh theo cách này, nhưng mã đang được tạo bởi chương trình khác và đây là cách dễ nhất để triển khai trình tạo.
Các trường không cần phải là kết quả cuối cùng; đó chỉ dành cho các tham số/biến cục bộ. Nếu anh ta gọi trường bên ngoài là 'y', anh ta có thể truy cập nó từ lớp bên trong nhất. –