Загадка анонимного класса

Я думаю, что понимаю основы анонимных классов, но я хотел бы кое-что прояснить. когда у меня есть такой синтаксис

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());
    }
}
Другие вопросы по тегам