在内部类(java)中访问局部变量

Rou*_*bie 18 java final inner-classes actionlistener

编译完代码后,我遇到了两个错误.

错误是:

1.

  local variable input is accessed within inner class; 
  needs to be declared final
     String name = input.getText();
Run Code Online (Sandbox Code Playgroud)

2.

  local variable c_age is accessed within inner class; 
  needs to be declared final
     Object child_age = c_age.getSelectedItem();
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

import javax.swing.*;
import java.awt.event.*;

public class GUI
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Try GUI");
        JLabel l1 = new JLabel("Please Enter Your Child's Name");
        JTextField input = new JTextField("",10);

        JLabel l2 = new JLabel("Choose Your Child's Age");
        String[] age = {"Age","1","2","3","4","5","6"};
        JComboBox c_age = new JComboBox(age);

        JButton button = new JButton("Search");

        JTextArea result = new JTextArea();
        JScrollPane extend_area = new JScrollPane(result);

        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                String name = input.getText();
                Object child_age = c_age.getSelectedItem();
            }
        });

        JPanel panel = new JPanel();
        panel.add(l1);
        panel.add(input);
        panel.add(l2);
        panel.add(c_age);
        panel.add(button);
        panel.add(extend_area);
        frame.add(panel);
        frame.setSize(350,350);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

edw*_*att 16

你需要申报

JTextField input = new JTextField("",10);
Run Code Online (Sandbox Code Playgroud)

JComboBox c_age = new JComboBox(age);
Run Code Online (Sandbox Code Playgroud)

像这样:

final JTextField input = new JTextField("",10);

final JComboBox c_age = new JComboBox(age);
Run Code Online (Sandbox Code Playgroud)

这意味着input并且c_age无法改变:

必须在内部类的主体之前明确地分配在内部类中使用但未声明的任何局部变量.

从Java语言规范,第8.1.3节内部类和封闭实例中获取的解释

  • 需要final,以便用户在内部类/闭包使用变量时不能更改变量.想一想:如果没有标记为final,内部类引用可以完成声明旁边的一些代码所能做的所有事情,因此您必须将其标记为final以避免并发问题,并且语法强制执行此操作. (3认同)

Muk*_*aur 5

如果你将变量声明为final,那么它将解决你的错误,但据我所知它不是解决问题的好方法.这里讨论过类似的问题,你可以看看这里有更多的了解.

在解决您的问题时,您可以通过使用它们来定义方法,您可以获得更好的解决方案.有关提示,您可以阅读 如何访问匿名内部类中的非最终局部变量