2013-12-20 2 views
1

Я читал учебник, и мне было интересно, почему аргумент, который мы передаем функции, не является ни примитивным, ни определяемым пользователем экземпляром класса.Передача кода в качестве аргументов функции

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() { 
     new ButtonDemo(); 
    } 
}); 

Я узнал, что это был либо один из этих двух. Но здесь кажется, что он передает пользовательский метод конструктора, например. Runnable(). Кажется, они хотят запустить поток позже, но когда? И я считаю, что это даже законно, но я никогда не слышал об этом в своем классе Java.

+3

[Классы Анонимные] (HTTP: // документы. oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) –

ответ

6

Это фактически передача экземпляра анонимного внутреннего класса, реализующего интерфейс Runnable. Читайте о них в the Java tutorial.

+0

Ничего себе, это было быстро. Жаль, что я еще не могу принять. – OnTheFly

+0

Он работает только один раз вправо? новый ButtonDemo() (создает кнопку) запускается один раз, почему это в потоке? – OnTheFly

+0

Запуск - это не поток. Это объект, который имеет метод run(). И вы передаете его SwingUtilities.invokeLater(), чтобы этот метод run() выполнялся в потоке отправки событий, поскольку все взаимодействия с компонентами swing должны выполняться из этого потока. –

5

Мне было интересно, почему аргумент, который мы передаем функции, не является ни примитивным, ни определяемым пользователем экземпляром класса.

Это экземпляр пользовательского класса. Единственное отличие состоит в том, что этот класс не имеет имени *.

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

* По крайней мере, не видимый пользователем: Java-компилятор присваивает каждому анонимному классу внутреннее имя, которое обычно содержит знак доллара.

0

Подробнее о . Это рассматриваются как отдельные классы. Если вы скомпилируете свой код и скажете, что имя файла: Test.java. При компиляции будут два файла класса Test.class и Test$1.class, и если у вас будет больше внутренних классов, у вас будет Test$2.class, Test$3.class и так далее.

3

Код внутри SwingUtilities что-то вроде этого

private Runnable runnable; 

private void invoke(){//called at some point from inside the runnable 
    runable.run(); 
} 
public void invokeLater(Runnable runnable){ 
    this.runnable=runnable; 
} 

Эти называются обратные вызовы.

+0

Это где-то между слишком упрощенным и неправильным по отношению к тому, как работает invokeLater. На самом деле SwingUtilities просто перенаправляет вызов EventQueue. EventQueue - связанный список, и вызов invokeLater добавляет к нему новый InvocationEvent. InvocationEvent - это то, что вызовы запускаются, когда EventDispatchThread накачивает события. – Radiodef

+1

@ Radiodef, понятия не имею, что именно происходит внутри SwingUtilities, но если бы я не знал, как работают обратные вызовы, приведенный выше код был бы отличным примером, чтобы показать мне логику, лежащую в их основе. – SteveL

Смежные вопросы