我想我理解匿名课程的基础知识,但我想澄清一些事情。 当我有这样的语法时
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,它是编译器给出的通用名称。
如果没有发生什么?感谢。
答案 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());
}
}