这段代码做了什么(曾经见过没有引用变量的对象?如果没有引用变量,稍后如何调用对象?)?

时间:2009-08-05 19:45:38

标签: java events object

EventQueue.invokeLater(new Runnable()
  {
     public void run()
        {
           ZipTestFrame frame = new ZipTestFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setVisible(true);
        }
  });

2 个答案:

答案 0 :(得分:9)

该代码创建一个实现runnable的匿名类的实例。该对象作为参数传递给EventQueue.invokeLater,稍后将调用它(意味着它将在稍后的某个时间点调用该对象上的run方法)。

您不需要变量指向对象,因为您只在该实例中使用该对象。方法invokeLater确实有一个指向对象的局部变量(假定对象作为参数传递,参数是局部变量),它用于将对象存储在事件队列中,现在也引用该对象,直到对象被调用并从队列中删除,此时它可以进行垃圾收集。

附录:

简单事件队列的原始示例:

class MyEventQueue {
    Queue<Runnable> queue = new LinkedList<Runnable>();
    public void invokeLater(Runnable r) {
        queue.add(r);
    }
    public boolean hasNext() {
        return !queue.isEmpty();
    }
    public void processNext() {
        queue.poll.run();
    }
}

答案 1 :(得分:0)

以下是事件的样子:

class Event { 
    Runnable RunnableObject; 
    public void invokeLater(Runnable runner) { 
        RunnableObject = runner; 
    }
    /* background thread */ 
    public void thread() { 
        while ( condition ) { 
            if ( itsLater ) { 
               RunnableObject->run();
            }
        }
     }
 }

在Event外观后面运行一个异步方法,它将传递给invokeLater的匿名对象并调用其run()方法。该对象仍然存在,它有一个定义 - 但它没有可用于随后询问它的引用,除非你使用run()方法将this指针传递给其他东西。