匿名阶级难题

时间:2011-10-15 14:53:50

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

我想我理解匿名课程的基础知识,但我想澄清一些事情。 当我有这样的语法时

class A
{
       class AnonymousClass1 Implements ActionListener{}
}
class A
{
     public A()
     {
        JButton btn = new JButton();

       btn.addActionListener( new ActionListener(){} );
     }
}

如果匿名类实际上是A类的内部类,如第一个例子所示:理论上,语义是否正确?

到底发生了什么?我认为编译java文件时,会为匿名类创建一个.class文件,因此可以引用它(但我找不到它)。当实例化A的对象时,它会创建一个按钮对象,然后btn会调用addActionListener()方法,该方法实际上传递了类似这样的btn.addActionListener(new AnonymousClassOne()) AnonymousClassOne,它是编译器给出的通用名称。

如果没有发生什么?感谢。

2 个答案:

答案 0 :(得分:3)

Anonymous课程可以通过美元符号及其后的数字识别 - Class$1.class。这些课程只是为了您自己的方便。想象一下:

class SaveButtonListener implements ActionListener {
  ...
}

class OpenButtonListener implements ActionListener {
  ...
}

这非常乏味。因此,您可以使用匿名类立即创建实现。编译器给出的名称前面是美元符号,后面是一些标识符。

幕后发生的事情是Java创建了一个带有自动生成名称的新内部类。

如果您发现我的解释凌乱,请随意提问。我现在累了。

答案 1 :(得分:1)

class A
{
    public A()
    {
        JButton btn = new JButton();
        btn.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                // ...
            }
        });
    }
}

或多或少被编译器重写为

class A
{
    private class SomeCuteName implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // ...
        }
    }

    public A()
    {
        JButton btn = new JButton();
        btn.addActionListener(new SomeCuteName());
    }
}