Lokale variable, die den Zugriff auf die innere Klasse deklariert werden muss-Finale
Hab ich ein problem der lokalen Variablen der Zugriff auf die innere Klasse deklariert werden müssen, endgültig. Es ist von der Methode createGrids() -> "squares[i][j] = 0;
" das ich ist eine lokale variable, die deklariert werden müssen, endgültig. Ich weiß nicht, warum, und ich habe Hinzugefügt letzten Felder ist es aber nicht so gut funktioniert.
import java.util.ArrayList;
import java.util.Random;
//weggelassen
public class Minesweeper{
private JFrame frame;
private int cols = 9;
private int rows = 9;
public static final int GRID_HEIGHT = 9;
public static final int GRID_WIDTH = 9;
final JButton[][] grids = new JButton[GRID_WIDTH][GRID_HEIGHT];
final int [][] squares = new int [GRID_WIDTH][GRID_HEIGHT];
private static int width = 500;
private static int heigth = 400;
private JPanel s;
private JPanel n;
private JPanel w;
private int mines = 10;
private int bomb = 1;
private JLabel j1;
private JPanel e;
private JRadioButton moreGrid;
ArrayList<Integer> list = new ArrayList<Integer>();
public Minesweeper() {
mines=10;
createGrids();
s = new JPanel();
n = new JPanel();
e = new JPanel();
w = new JPanel();
resetButton = new JButton("Rest");
resetButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ createGrids();}
});
newGameButton = new JButton("New Game");
frame.add(n, BorderLayout.NORTH);
frame.add(w, BorderLayout.WEST);
frame.add(s, BorderLayout.SOUTH);
s.add(resetButton);
s.add(newGameButton);
}
public void game()
{
for(int i = 0; i < GRID_WIDTH; i++) {
for(int j = 0; j < GRID_HEIGHT; j++) {
squares[i][j] = 0;
}
}
}
public void setRandom()
{
Random r = new Random();
for(int x = 0; x < mines; x++){
int b = r.nextInt(9);
int c = r.nextInt(9) ;
squares[b][c] = bomb;
}
}
public void createGrids(){
frame = new JFrame("Minesweeper");
createMenuBar(frame);
frame.setTitle("Nicholas Minesweeper");
JPanel m = new JPanel(new GridLayout(9,9));
for(int i = 0; i < GRID_WIDTH; i++) {
for(int j = 0; j < GRID_HEIGHT; j++) {
grids[i][j] = new JButton();
grids[i][j].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (squares[i][j] == 1)
{
System.out.println("BOmb");
}
else {
grids[i][j].setVisible(false);
}
}
});
m.add(grids[i][j]);
}
}
frame.add(m, BorderLayout.CENTER);
frame.setResizable(false);
frame.setSize(width, heigth);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(350, 250);
frame.setVisible(true);
}
}
- Möglich, Duplikat der Variable zugegriffen wird, in einer inneren Klasse. Deklariert werden muss-Finale
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anonyme innere Klassen haben Zugriff auf lokale Variablen durch einen trick hinter die kulissen. Lokale Variablen sind implementiert als hidden-member-Variablen der inneren Klasse. Sie zugeordnet sind, Kopien der lokalen Variablen. Um zu verhindern, dass die Kopie mit dem Wert von Unrecht, der Java-compiler erzwingt, dass diese lokalen Variablen muss
final
so dass Sie nicht geändert, so dass die Kopie bleibt richtig.Die Felder der umgebenden Klasse nicht brauchen, um
final
; die lokalen Variablen verwendet werden müssenfinal
. Sie müssen alle lokalen Variablen, die Sie in Ihrem anonymen inneren Klassefinal
. Sie können dies tun, indem er erklärtfinal
Variablen initialisiert werden, um Ihrei
undj
Werte, und verwenden Sie Sie in Ihrer anonymen inneren Klasse.Beachten Sie, dass in Java 8, das wäre nicht nötig, da die Java-8-compiler kann erkennen, ob die lokalen Variablen, die in anonymen inneren Klassen sind "effektiv final", das heißt, nicht
final
aber nie geändert, sobald Sie initialisiert wurde.Was passiert ist, dass Sie erstellen 81 ActionListener-Klassen, jede mit Ihren eigenen
actionPerformed
Methode. Aber wenn die Methode ausgeführt wird, wird die Klasse nicht wissen, was der Wert voni
undj
mehr ist, da verließ er Sie weit hinter sich.Java verhindert, dass dieses geschieht, damit der compiler-Fehlermeldung. Es erfordert alle referenzierten lokalen Variablen final, so dass es passieren kann Sie zu den erstellten Klassen.
Der einfachste Weg, dies zu lösen, ist das erstellen von ein paar
final
Variablen innerhalb Ihres loops: