Java中的内部类

我正在为我的Hangman游戏制作类似键盘的按钮( 参见图片 ),我的问题是关于内部课程。 我已经阅读了关于内部类的LINK ,它说你只能使用FINAL类型访问外部变量。 但是如果我这样声明变量,我就不能再改变它的值……所以我的问题是我需要改变内部类中的值。 我的代码如下:

 public class MainGame extends JDialog { private String player; private char [] wordChar; private JButton[] buttons; private int level; private int score; private int livesLeft; private int missedGuess; void newGame() { level = 0; score = 0; livesLeft = 10; missedGuess = 0; //label1: // while (livesLeft!= 0) { //get random WORD from LIST Word hiddenWord = new Word(); //put random word in Array wordChar = new char[hiddenWord.getHiddenWord().length()]; wordChar = hiddenWord.getHiddenWord().toCharArray(); buttons = new JButton[wordChar.length]; for (int i = 0; i < wordChar.length; i++){ JButton guessWord = new JButton(" "); guessWord.setFont(new Font("Microsoft Sans Serif", 1, 18)); guessWord.setEnabled(false); jPanel3.setLayout(new GridLayout(1, wordChar.length)); jPanel3.add(guessWord); buttons[i] = guessWord; } checkLetter(); } void checkLetter() { int checker = 0; while(checker != wordChar.length){ jPanel1.setLayout(new GridLayout(3, 9, 3, 5)); for (char buttonChar = 'a'; buttonChar <= 'z'; buttonChar++) { String buttonText = String.valueOf(buttonChar); final JButton letterButton = new JButton(buttonText); letterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); for (int j = 0; j < wordChar.length; j++){ String text = String.valueOf(wordChar[j]); if(actionCommand.equals(text)){ buttons[j].setText(text); checker++; //THIS CODE IS NOT POSSIBLE!!!! } } } }); jPanel1.add(letterButton); } checker++; } } 

注意:上面的代码不完整。 int检查器用于计算已经猜到多少个正确的字母,这样如果它等于单词的长度,我现在可以进入下一个级别 在此处输入图像描述

我该如何重新编写代码?

您可以将checker声明为外部类的字段,并使用某种方法访问它,例如increaseChecker()

更新:这样的事情:

1)在外部类中创建检查器字段:

 public class OuterClassName { private int checker; protected void increaseChecker() { checker++; } void checkLetter() { // ... } } 

2)使用increaseChecker()方法调用而不是checker++

您无法访问匿名内部类中的局部变量,这是有充分理由的。 不保证在checkLetter()函数内调用actionPerformed()方法。 稍后将调用它,可能(并且很可能)在函数退出之后调用,因此它的局部变量将在那时被销毁。 因此,新创建的匿名类隐式获取该变量的副本。 但是增加副本没有任何意义,这就是为什么只能从匿名类的方法访问最终的局部变量。

最简单的解决方法是使checker成为外部类的字段。 但是,如果仅在checkLetter()函数中访问它,那将没有任何意义,除非它必须在checkLetter()调用之间保留其值。 为了找到真正的答案,你需要考虑为什么你要在actionPerformed()中增加checker ? 应该什么时候发生,你想通过做什么来实现?

为什么不保留匿名内部类,但让它调用类的方法。 这样决赛不是问题。

  letterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { letterButtonActionPerformed(e); // create this method } }); //..... // new method private void letterButtonActionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); for (int j = 0; j < wordChar.length; j++){ String text = String.valueOf(wordChar[j]); if(actionCommand.equals(text)){ buttons[j].setText(text); checker++; //THIS CODE IS NOT POSSIBLE!!!! } } }