onclick,onfocus,onload,oncreate......
咱們在java GUI 編程、js事件、android組建中經常見到這些單詞,這些函數就是回調函數。C語言利用指針實現回調,與面向對象的語言不一樣。咱們這裏介紹利用java的接口實現回調的方法。java
回調是一種雙向的調用模式,例如咱們要調用B的一個特定的方法,B在執行完又要調用A的一個方法,而這個A(或者說A的這個方法)是由咱們本身實現的。因此能夠這樣理解:「回調函數也是一個函數或過程,不過它是一個由調用方本身實現,供被調用方使用的特殊函數。」android
不過,有了面向對象的機制後,咱們就能夠輕鬆地使用這套機制來實現回調了,讓回調變得簡單。編程
例子:ide
package com.yawn.callback; /** * 回調要達到的效果就是在執行完b的go方法以後,再自動調用咱們本身實現的onFinish方法 * A能夠是任何一個實現了Finish接口的類,用於存放咱們實現的onFinish方法 * * @author yawn * */ public class CallBack { public static void main(String[] args) { B b = new B(new A()); // 初始化B並指定B所要回調的對象(方法) b.go(); } } class A implements Finish{ @Override public void onFinish() { System.out.println("finish"); } }
package com.yawn.callback; /** * B的內部實現也很簡單,只須要一個接口類型的成員變量(這個成員變量的具體實現由咱們初始化B時指定), * 在執行方法完成時調用這個成員變量(接口對象)的onFinish方法便可 * * @author yawn * */ public class B { Finish f ; public B(Finish f){ this.f = f; } void go(){ System.out.println("Go go go!"); if (f != null){ f.onFinish(); } } }
package com.yawn.callback; public interface Finish { void onFinish(); }
這樣就能夠在調用B的go方法以後又調用咱們實現的onFinish方法了。函數
運行結果 Go go go! finish
其實在初始化B時不必定要實現一個類A,也能夠直接實現接口中的方法:this
package com.yawn.callback; /** * 回調要達到的效果就是在執行完b的go方法以後,再自動調用咱們本身實現的onClick方法 * A能夠是任何一個實現了Finish接口的類,用於存放咱們實現的onFinish方法 * * @author yawn * */ public class CallBack { public static void main(String[] args) { B b = new B(new Finish() { @Override public void onFinish() { System.out.println("finish"); } }); b.go(); } }