1

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

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 编译器给出的通用名称。

如果不是,会发生什么?谢谢。

4

2 回答 2

4

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

class SaveButtonListener implements ActionListener {
  ...
}

class OpenButtonListener implements ActionListener {
  ...
}

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

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

如果您发现我的解释混乱,请随时提出问题。我现在累了。

于 2011-10-15T14:57:24.060 回答
2
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());
    }
}
于 2011-10-15T18:07:11.590 回答