3

作为番茄钟技术的粉丝,我正在为自己制作一个倒数计时器,以让我专注于我的家庭作业。然而,这个特定的项目不是家庭作业。:)

Stack 有很多关于在用户输入之前使用计时器来控制延迟等问题,但在独立计时器上却没有很多问题。我从朋友那里看到了这段代码,并研究了 Java 文档上的课程。

public class Stopwatch {
    static int interval;
    static Timer timer;

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("Input seconds => : ");
        String secs = sc.nextLine();
        int delay = 1000;
        int period = 1000;
        timer = new Timer();
        interval = Integer.parseInt( secs );
        System.out.println(secs);
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run()
            {
                System.out.println(setInterval());
            }
        }, delay, period);
    }
    private static final int setInterval()
    {
        if( interval== 1) timer.cancel();
        return --interval;
    }
}

有一些语法我不清楚。考虑:

timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

我不明白括号和大括号是如何工作的。乍一看,鉴于scheduleAtFixedRate(TimerTask task, long delay, long period)我可以看到delayandperiod参数的用法,但不是第一个参数之前的开放括号。

我的第一个参数实际上是整个代码块吗?我希望整个块都被括号包围......但事实并非如此。这是java中的常见语法吗?我以前从未遇到过它。

新 TimerTask() { public void run() { System.out.println(setInterval()); } }

我只是想澄清一下,在我开始修改更改之前我理解它。

4

3 回答 3

9
timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

该代码等效于此重构,其中将new TimerTask分配给局部变量。

TimerTask task = new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
};

timer.scheduleAtFixedRate(task, delay, period);

当然,奇怪的部分刚刚向上移动了一点。这到底是什么new TimerTask东西?

Java 具有用于定义匿名内部类的特殊语法。匿名类是一种语法便利。TimerTask您可以在使用时直接定义它及其run()方法,而不是定义其他地方的子类。

上面的代码等价于下面的代码,匿名TimerTask子类变成了显式命名的子类。

class MyTimerTask extends TimerTask
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
于 2013-03-22T13:13:51.083 回答
2

你是对的,第一个参数是整个代码块:

new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

这些声明称为匿名类,在 Java 教程中有更详细的解释。

于 2013-03-22T13:12:14.527 回答
1

它是一个匿名内部类。您需要研究内部类才能理解这一点。通常,当您不需要在代码中的其他位置使用该类时,会使用此类类。你不能在其他地方使用它,因为你没有指向它的参考。 您也可以将上面的代码替换如下:

class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            // Timer task code goes here.
             System.out.println(setInterval());
        }

    }
    MyTimerTask timerTask = new MyTimerTask();
    timer.scheduleAtFixedRate(timerTask, delay, period);
于 2013-03-25T06:15:42.530 回答