Java中的内部类

Java中的内部类,java,Java,我正在为我的刽子手游戏()制作一个类似键盘的按钮,我的问题是关于内部类。我读过这篇关于内部类的文章,上面说只能使用FINAL类型访问外部变量。但是如果我这样声明变量,我就不能再改变它的值了。。。所以我的问题是我需要更改内部类中的值。我的代码如下: public class MainGame extends JDialog { private String player; private char [] wordChar; private JButton[] button

我正在为我的刽子手游戏()制作一个类似键盘的按钮,我的问题是关于内部类。我读过这篇关于内部类的文章,上面说只能使用
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++;
          }
        }
public类MainGame扩展JDialog{
私人弦乐演奏者;
私有字符[]wordChar;
私有JButton[]按钮;
私有整数级;
个人智力得分;
私有的int livesLeft;
私密性失误;
void newGame(){
级别=0;
得分=0;
livesLeft=10;
missedGuess=0;
//标签1:
//while(livesLeft!=0){
//从列表中获取随机单词
单词hiddenWord=新词();
//将随机字放入数组
wordChar=新字符[hiddenWord.getHiddenWord().length()];
wordChar=hiddenWord.getHiddenWord().ToCharray();
按钮=新的JButton[wordChar.length];
for(int i=0;i对于(char buttonChar='a';buttonChar您可以将
checker
声明为外部类的字段,并使用某种方法访问它,比如
increaseChecker()

更新:类似以下内容:

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

public class OuterClassName {
    private int checker;

    protected void increaseChecker() {
        checker++;
    }

    void checkLetter() {
        // ...
    }

}

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

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


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

为什么不保留匿名内部类,但让它调用该类的一个方法。这种方式不是问题

            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!!!!
                        }
                    }
            }
letterButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
letterButtonActionPerformed(e);//创建此方法
}
});
//.....
//新方法
已执行的专用无效字母按钮操作(ActionEvent e){
字符串actionCommand=e.getActionCommand();
for(int j=0;j
如果你解释一下
检查器
在做什么,除了明显的控制检查外,它可能会帮助人们提出设计方案。int检查器用于计算已经猜到的正确字母数,这样如果它等于单词的长度,我现在就可以继续下一步了level@newbie:然后变量
检查er
需要存在,直到游戏结束。在Java中,方法的局部变量仅在该方法执行时存在。因此,
检查器当前在新游戏开始后即被处理,但它应该存在,直到游戏结束-就像
wordChar
一样。因此,简单的解决方案是声明
checker
,就像声明
wordChar
——并在
newGame()中重置它。