Загадка анонимного класса - PullRequest
0 голосов
/ 15 октября 2011

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

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

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

Если анонимный класс на самом деле является внутренним классом класса А, как в первом примере: теоретически, семантика верна?

Что именно происходит?Я думаю, что когда java-файл компилируется, создается файл .class для анонимного класса, поэтому на него можно ссылаться (но я не смог его найти).Когда создается объект A, он создает объект кнопки, затем btn вызывает метод addActionListener (), который фактически передает что-то вроде этого btn.addActionListener(new AnonymousClassOne()) AnonymousClassOne - универсальное имя, данное компилятором.

Если нет, что происходит?Спасибо.

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Anonymous классы могут быть распознаны знаком доллара и числом после него - Class$1.class.Эти занятия только для вашего удобства.Представьте себе:

class SaveButtonListener implements ActionListener {
  ...
}

class OpenButtonListener implements ActionListener {
  ...
}

Это очень утомительно.Таким образом, вы можете сразу создать реализацию с помощью анонимного класса.Компилятор дает имя, предшествующее знаку доллара, и некоторый идентификатор после него.

За кулисами происходит то, что Java создает новый внутренний класс с автоматически сгенерированным именем.

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

1 голос
/ 15 октября 2011
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());
    }
}
...