【Java入門提高篇】Day5 Java中的回調(二)
Java中有很多個Timer,常用的有兩個Timer類,一個java.util包下的Timer,一個是javax.swing包下的Timer,兩個Timer類都有用到回調機制。可以使用它在到達指定時間間隔後發出通知,例如程序中有一個時鐘,就可以每秒請求發送一個通知,以便更新時間顯示。那麽怎樣通知Timer去完成我們的任務呢?在其他語言中,可以提供一個函數名,然後定時器周期性的調用它,但Java使用的是面向對象編程的思想,將某個類的對象傳遞給定時器,然後定時器再調用這個對象的方法,由於對象能攜帶的信息比函數要多,所以這樣也會更加靈活。
這裏僅僅為了說明回調,僅介紹需要用到的Timer的方法,不會對Timer做過詳細的介紹。
以swing中的Timer為例,Timer接收的對象必須先實現java.awt.event中的ActionListener接口,下面是接口的原型:
public interface ActionListener{ void actionPerformed(ActionEvent event); }
所以我們先設計一個類來實現這個接口,這裏我們覆蓋這個actionPerformed方法來輸出時間。
public class TimePrinter implements ActionListener { @Override publicvoid actionPerformed(ActionEvent e) { Date now = new Date(); System.out.println("Time is " + now + " now."); } }
然後,我們就可以生成一個TimerPrinter對象來傳入Timer了。
public class Test { public static void main(String[] args) { ActionListener listener = new TimePrinter(); Timer t= new Timer(1000,listener); t.start(); JOptionPane.showMessageDialog(null,"Quit program?");//彈出對話框,防止主線程結束導致時鐘結束 System.exit(0); } }
這裏我們使用了一個彈出對話框的語句,不需要深究,只要知道這樣可以阻塞主線程,讓時鐘能繼續運行就OK。以下是運行結果:
Time is Mon Dec 04 00:01:20 CST 2017 now. Time is Mon Dec 04 00:01:21 CST 2017 now. Time is Mon Dec 04 00:01:22 CST 2017 now. Time is Mon Dec 04 00:01:23 CST 2017 now. Time is Mon Dec 04 00:01:24 CST 2017 now. Time is Mon Dec 04 00:01:25 CST 2017 now.
每秒輸出一次,也就是每秒會調用一次TimePrinter的actionPerformed方法,這就是最典型的回調(感覺上一篇的栗子還是講的有點復雜了)。
其實可以這樣來理解回調,就是我把某個方法的處理權交給你,你可以在合適的時機使用這個方法,那你如何知道該使用哪個方法?這時候就發揮接口的作用了,實現了接口就代表必定存在這個函數,這樣你就可以放心大膽的使用了。
【Java入門提高篇】Day5 Java中的回調(二)