6

这是代码:

    timer.schedule(new TimerTask() 
    {
       public void run()
       {
            synchronized(this)
            {
                 try 
                 {   
                   // System.out.println(" ITERATION = ");

                     pachubeCLI.update(78164);  

                 } 
                 catch (PachubeException e)
                 {
                        // If an exception occurs it will print the error message from the
                        // failed HTTP command
                        System.err.println(e.errorMessage);
                 } 
                 catch (IOException e) 
                 {
                        System.err.println(e);
                 } 

             }
        }
    }, 0, 5*1000);

我可以说代码基本上是用于使用Timer类的对象来安排操作。schedule根据 eclipse,传递给该方法的参数是(TimerTask task,long delay, long period). 但是看看这段代码,整个代码块被作为第一个参数而不是对TimerTask类的引用传递。我以前从未见过这样的方法。这里到底发生了什么?

一些背景:该对象的schedule方法Timer被用于定期更新 Xively(以前是 COSM(以前是 pachube))上的提要。

另外我不知道哪个标签描述了这里发生的事情。如果你这样做,请添加它或发表评论。

4

3 回答 3

8

您正在查看的内容被称为“匿名内部类”。

在此处查看 javadoc:http: //docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

还有这个问题: Java 中如何使用匿名(内部)类?.

而且,为了记录,您在问题中使用的两个标签都是合适的。

于 2013-09-09T18:10:23.550 回答
2

这里的方法schedule需要一个object of class type TimerTask, 和two other arguments, 可能的参数int and time in ms。我们通过匿名内部类传递一个对象。

代码创建了一个TimerTask类的实例,但我们甚至没有给这个类起个名字——那就是匿名内部类

匿名类指南。

  1. 匿名类同时声明和初始化。
  2. 匿名类必须扩展或实现一个且只有一个类或接口。
  3. 由于匿名类没有名字,所以只能使用一次。
于 2013-09-09T18:17:01.343 回答
1

正在发生的事情的逻辑等价物是:

  • 扩展类TimerTask,例如MyTimer extends TimerTask

  • 创建新类的实例MyTimer mt = new MyTimer()

  • 实际的函数调用timer.schedule(mt, 0, 5*1000);

这个概念被称为匿名内部类。这就是第一步中发生的事情。第二步和第三步也可以合并。可以在需要的地方直接创建实例。那就是所谓的匿名对象

要获得更多见解,您应该阅读这些概念。它们并不难掌握。ActionListener如果您需要接口的标准实例(例如在 GUI 编程中),它们通常会被使用。


为了完整起见,还有一个成语叫做双括号初始化。但总的来说,这不是一个好习惯。

于 2013-09-09T18:23:06.913 回答