我需要帮助理解java中Timer类的scheduleAtFixedRate方法

我需要帮助理解java中Timer类的scheduleAtFixedRate方法,java,syntax,Java,Syntax,作为一个家庭作业迷,我给自己做了一个倒计时器,让我完成家庭作业。然而,这个特殊的项目不是家庭作业 Stack在使用计时器控制用户输入前的延迟等方面有很多问题,但在独立计时器方面问题不多。我从一位朋友那里偶然发现了这段代码,并研究了Java文档类 public class Stopwatch { static int interval; static Timer timer; public static void main(String[] args) {

作为一个家庭作业迷,我给自己做了一个倒计时器,让我完成家庭作业。然而,这个特殊的项目不是家庭作业

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任务,长延迟,长周期)
我可以看到
delay
period
参数,但不能看到第一个参数前面的打开参数

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

新TimerTask() { 公开募捐 { System.out.println(setInterval()); } }


我只是想澄清一下,在我开始胡闹改变之前,我理解它

没错,第一个参数是整个代码块:

new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}
这些声明称为匿名类,将在中详细解释

该代码相当于此重构,其中
新TimerTask
被分配给一个局部变量

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

timer.scheduleAtFixedRate(task, delay, period);
当然,奇怪的部分只是向上移动了一点。这到底是什么
newtimertask
东西

Java有特殊的语法来定义。匿名类在语法上很方便。您不必在其他地方定义
TimerTask
的子类,而可以在使用时定义它及其
run()
方法

上面的代码相当于下面的代码,将匿名
TimerTask
子类转换为显式命名子类

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

TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
这是一个好主意。你需要学习内部类来理解这一点。通常,当您不需要在代码中的其他位置使用该类时,就会使用此类类。您不能在其他地方使用它,因为您没有指向它的引用。 您还可以按如下方式替换上述代码:

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);

好极了还感谢他们的名字,这样我就知道该在教程中查找什么了。:)@威尔森66:不客气。不要忘记对有用的答案进行投票,如果您满意,请将最好的答案标记为已接受。
但是,这个项目不是家庭作业。:)听起来像是有人试图让StackOverflow解决他们的家庭作业时会说的话。ಠ~ಠ
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);