作为番茄钟技术的粉丝,我正在制作一个倒数计时器,让我完成我的作业任务.然而,这个特殊的项目不是功课.:)
Stack有很多关于在用户输入之前使用定时器来控制延迟的问题,但在独立的定时器上却没有太多问题.我从朋友那里遇到了这段代码,并且已经学习了Java Documentation的课程.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
有些语法对我来说并不清楚.考虑:
timer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
}, delay, period);
Run Code Online (Sandbox Code Playgroud)
我不明白括号和括号是如何工作的.乍一看,鉴于scheduleAtFixedRate(TimerTask task, long delay, long period)我的用法,我可以看到delay和period参数,但不是第一个参数之前的开放式.
我的第一个参数实际上是整个代码块吗?我希望整个区块被圆括号包围......但事实并非如此.这是java中的常见语法吗?我以前从未碰过它.
new TimerTask(){public void run(){System.out.println(setInterval()); }}
我只是想在我开始改变之前澄清我的理解.
timer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
}, delay, period);
Run Code Online (Sandbox Code Playgroud)
该代码等同于此重构,其中将new TimerTask其分配给局部变量.
TimerTask task = new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
};
timer.scheduleAtFixedRate(task, delay, period);
Run Code Online (Sandbox Code Playgroud)
当然,奇怪的部分刚刚向上移动了一点.这是什么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);
Run Code Online (Sandbox Code Playgroud)