5
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        Example ex = new Example();
        ex.setVisible(true);
    }
});

下面是一段代码new Runnable()。我如何理解这段代码?我不记得我们可以将代码块直接传递给 java 中的任何对象。

4

5 回答 5

7

它不是代码块。它是一个对象。

当你说,

new Runnable()

您正在创建一个实现 Runnable 接口的对象,特别是run()方法。

正如方法名称所暗示的,invokeLater()将在稍后的某个时间点调用run()您的可运行接口实现对象(或可运行对象)的方法。

正如另一张海报提到的,这是匿名类的一个例子。它确实是一种以更简洁的方式快速编写代码的便利机制。如果你不喜欢这样,你可以这样做——

创建一个实现 Runnable 的新类 -

public class RunnableImplementation implements Runnable
 {
   public void run() 
    {
        Example ex = new Example();
        ex.setVisible(true);
    }
 }

然后,您示例中的代码变为 -

SwingUtilities.invokeLater(new RunnableImplementation()); 
于 2013-04-29T19:26:42.523 回答
4

它正在创建一个匿名内部类的实例。与其从命名类派生并创建它的实例,不如Runnable内联完成整个事情。

请参阅匿名类

于 2013-04-29T19:27:30.340 回答
1

您没有传递任何代码块,您实际上是在覆盖类的run方法Runnable

于 2013-04-29T19:27:47.167 回答
0

如何理解这段代码?这就是所谓swing event queue的,它有助于防止并发问题。它按顺序调用此队列中run()每个对象的方法。Runnable

于 2013-04-29T19:29:05.430 回答
0

你的代码

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    Example ex = new Example();
    ex.setVisible(true);
  }
});

相当于

SwingUtilities.invokeLater(new MyRunnable() );

whereMyRunnable是一个Runnable使用您拥有的代码实现接口的类,并且仅为此目的而创建并且不能再次使用。

注意MyRunnable不是实际名称,只是为了说明这一点而编造出来的。

于 2013-04-29T19:39:19.050 回答