này có gì để làm với Swing, không có gì cả. Bạn sẽ hiển thị mã của bạn có một ví dụ về điều này, nhưng có thể bạn đang sử dụng một lớp bên trong, có thể là một lớp bên trong vô danh, và nếu bạn sử dụng chúng và cố gắng sử dụng các biến bên trong lớp bên trong. khối khác, chẳng hạn như hàm tạo), sau đó bạn được yêu cầu để tạo các biến này cuối cùng hoặc quảng bá chúng thành các trường lớp. Một lần nữa đây là yêu cầu Java, không phải yêu cầu Swing.
Một ví dụ Swing:
public MyConstructor() {
final int localIntVar = 3; // this must be final
myJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// because you use the local variable inside of an anon inner class
// not because this is a Swing application
System.out.println("localIntVar is " + localIntVar);
}
});
}
và một ví dụ Non-Swing:
public void myMethod() {
final String foo = "Hello"; // again it must be final if used in
// an anon inner class
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(foo);
try {
Thread.sleep(1000);
} catch (Exception e) {}
}
}
}).start();
}
Có một vài thủ thuật để tránh điều này:
- Thúc đẩy việc biến một trường lớp , cho nó phạm vi lớp.
- Yêu cầu lớp bên trong ẩn danh gọi phương thức của lớp ngoài. Nhưng sau đó, biến sẽ vẫn cần phải có phạm vi lớp.
Chỉnh sửa 2 Anthony Accioly đăng một câu trả lời với một liên kết tuyệt vời, nhưng sau đó không rõ lý do xóa câu trả lời của mình. Tôi muốn đăng liên kết của anh ấy ở đây, nhưng rất thích nhìn thấy anh ta mở lại câu trả lời của anh ấy.
Cannot refer to a non-final variable inside an inner class defined in a different method
Nguồn
2012-01-05 15:36:34
Bạn có thể đưa ra ví dụ không? Bạn đang nói về việc sử dụng các biến từ một phương thức xung quanh trong một lớp bên trong vô danh? Bởi vì không có gì trong Swing chính nó thực thi bạn để tạo các biến 'final'. – Jesper
Tôi đặt cược rằng bạn đang sử dụng lớp bên trong vô danh. –