Загадка анонимного класса
Я думаю, что понимаю основы анонимных классов, но я хотел бы кое-что прояснить. когда у меня есть такой синтаксис
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 ответа
Anonymous
классы могут быть признаны знаком доллара и числом после него - Class$1.class
, Эти занятия только для вашего удобства. Вообразите это:
class SaveButtonListener implements ActionListener {
...
}
class OpenButtonListener implements ActionListener {
...
}
Это очень утомительно. Таким образом, вы можете сразу создать реализацию с помощью анонимного класса. Компилятор дает имя перед знаком доллара и некоторый идентификатор после него.
За кулисами происходит то, что Java
создает новый внутренний класс с автоматически сгенерированным именем.
Не стесняйтесь задавать вопросы, если вы находите мое объяснение грязным. Я устал сейчас.
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());
}
}