Java是一門面嚮對象語言,一切皆對象,因此在Java中不存在回調函數這一說法的。由於Java的一切皆對象性質,從而將回調函數這個特性提升到了接口回調。
接口回調是什麼?
接口回調:可以把使用某一接口的類創建的對象的引用賦給該接口聲明的接口變量,那麼該接口變量就可以調用被類實現的接口的方法。實際上,當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法,這一過程稱爲對象功能的接口回調。
從概念可以看出,接口回調是指一個使用過程,並強調是關於對象功能的使用過程,既然是功能,功能一般就對應着方法體(函數),因此它同樣滿足與回調函數相似的模型。
(1)接口的定義(裏面有方法)
(2)接口的實現 (類去實現這個接口)
(3)調用接口
將(2)的引用(地址)傳遞給(3),然後(3)調用(2)中的方法,這一過程稱爲對象功能的接口回調。
如何使用接口回調?
接口回調,我將其分爲兩種方式,一種推模式,一種爲拉模式。
推模式
接口回調的推模式,指的是,甲方主動將其地址推送給調用者。比如下例:
接口:
public interface GasListener接口實現的甲方:
{
public void offerGas(String msg);
}
public class GasCompany implements GasListener調用者:
{
public void advertiseTo(IndoorsMan man)
{
System.out.println("煤氣公司:這是我們的聯繫方式,歡迎來電!");
man.setListener(this);
}
@Override
public void offerGas(String msg)
{
System.out.println("煤氣公司接收的訂單:"+msg);
}
}
public class IndoorsMan測試:
{
GasListener gListener;
public void prepareCook()
{
System.out.println("宅男:準備下廚做幾個花式大菜!");
System.out.println("宅男:進廚房,燒菜...");
System.out.println("宅男:剛開火,就發現煤氣不足,沒辦法,只能打電話叫煤氣。");
gListener.offerGas("宅男:送一瓶煤氣過來!");
}
public void setListener(GasListener gListener)
{
this.gListener = gListener;
}
}
public class TestGasCompany公司在打廣告時,就主動把自身信息告訴了IndoorsMan,當IndoorsMan發現煤氣不足這一事件發生時,IndoorsMan就根據接口的引用調用GasCompany服務。
{
public static void main(String[] args)
{
IndoorsMan man = new IndoorsMan();
GasCompany company = new GasCompany();
company.advertiseTo(man);
man.prepareCook();
}
}
調用者
public class IndoorsMan
{
GasListener gListener;
public void prepareCook()
{
System.out.println("宅男:準備下廚做幾個花式大菜!");
System.out.println("宅男:進廚房,燒菜...");
System.out.println("宅男:剛開火,就發現煤氣不足,沒辦法,只能打電話叫煤氣。");
gListener.offerGas("宅男:送一瓶煤氣過來!");
}
public void setListener(GasListener gListener)
{
this.gListener = gListener;
}
public void configureGas()
{
// 主動獲取甲方信息
setListener(new GasListener()
{
@Override
public void offerGas(String msg)
{
System.out.println("下單內容:"+msg);
}
});
}
}
public class Test
{
public static void main(String[] args)
{
IndoorsMan man = new IndoorsMan();
man.configureGas();
man.prepareCook();
}
}
public class Test
{
public static void main(String[] args)
{
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
}
});
}
}
參考地址:http://blog.csdn.net/xiaanming/article/details/8703708
http://www.cnblogs.com/aoguren/p/5544865.html
http://www.importnew.com/19301.html
http://www.cnblogs.com/wangming007/p/5122701.html
http://blog.csdn.net/michael1112/article/details/53573830?locationNum=3&fps=1
http://blog.csdn.net/lvzishen123/article/details/50281667