从匿名类参数访问类的实例

时间:2014-03-27 09:49:57

标签: java actionlistener inner-classes anonymous-inner-class

我似乎无法通过网站上的所有匿名内部课程问题找到答案。

public void start()
{
    /* Ask the user to login */
    final LoginFrame login;
    login = new LoginFrame(new ActionListener()
    {
        @Override
        public void actionPerformed(final ActionEvent event)
        {
            switch (event.getActionCommand())
            {
                case "login":
                    /* @todo Login the user */
                    String username = login.getUsername();
                    String password = login.getPassword();
            }
        }
    });
    login.display();
}

我的登录框架包含ActionListener。如何从login

中访问new ActionListener()

现在我收到一个错误:

  

可能尚未初始化变量登录。

3 个答案:

答案 0 :(得分:3)

您不能使用AFAIK,因为ActionListener将首先创建,并且此时必须有权访问尚未初始化的最终变量login

通话顺序如下:

  • 创建ActionListener
  • 的实例
  • 将该实例传递给LoginFrame构造函数
  • 将创建的框架分配给login

现在假设ActionListener构造函数将访问login - 它不会被初始化并且会导致错误。

要解决此问题,您需要先创建框架,然后设置ActionListener,即

final LoginFrame login = new LoginFrame();
login.addActionListener( new ActionListener() { ... } );

答案 1 :(得分:1)

您必须在创建ActionListener后分配LoginFrame

在编译器告诉您的login字段被分配的第一个或之前评估赋值的右侧。

使用侦听器更常见的是使用add方法,因此我将代码更改为:

private final login = new LoginFrame();

login.addActionListener(
  new ActionListener()
  {
    @Override
    public void actionPerformed(final ActionEvent event)
    {
      switch (event.getActionCommand())
      {
        case "login":
          /* @todo Login the user */
          String username = login.getUsername();
          String password = login.getPassword();
      }        
    }      
  }
);    

login.display();

答案 2 :(得分:0)

您尚未初始化变量login,而您正在使用它。

通过anonymous class,您正在初始化变量,因此您可以在初始化变量后使用它。如果你想使用这个变量,你必须初始化它(但永远不要用null值初始化你的变量,因为你使用的是LoginFrame类的方法,它必须抛出NullPointerException)。