本文實例講述了Java的回調機制。分享給大家供大家參考,具體如下:
南開網(wǎng)站建設公司創(chuàng)新互聯(lián),南開網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為南開近1000家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設要多少錢,請找那個售后服務好的南開做網(wǎng)站的公司定做!
一 代碼
interface CallBack // 回調接口 { void methodToCallBack( ); //回調方法 } class CallBackImpl implements CallBack // 實現(xiàn)回調接口和回調方法 { public void methodToCallBack( ) { System.out.println("I've been called back"); } } public class Caller { public void register(CallBack callback) // 注冊回調接口 { callback.methodToCallBack( ); // 通過回調接口調用回調方法 } public static void main(String[] args) { Caller caller = new Caller( ); //B處 CallBack callBack = new CallBackImpl( ); //A處 caller.register(callBack); //C處 } }
二 運行
I've been called back
三 說明
回調機制的真正意圖,就是實現(xiàn)控制反轉,通過控制反轉。對象在被創(chuàng)建的時候(如A處),由一個能夠調控系統(tǒng)內(nèi)所有對象的外界實體(如B處的caller),將其所依賴對象的引用傳遞給功能方法體(如C處的callBack,被送入到register)。
同一個接口,可以有不同的實現(xiàn)類,從而使得這些不同的實現(xiàn)類,可以定義眾多不同的對象,而這些不同的對象會被按需注入功能方法塊register。在被調用前,這些對象永遠處于等待調用狀態(tài),直到有一天被回調。
四 代碼
import java.awt.Rectangle; interface Measurer { // 這個anObject,并不明確。不明確的用意是,先不綁定任何特定的對象 double measure( Object anObject ); } // 把抽象的measure方法具體化 class AreaMeasurer implements Measurer { public double measure(Object anObject) { // 把抽象的對象明確化,由于Object對象是所有對象的鼻祖,所以,它可以化身任何對象 Rectangle aRectangle = (Rectangle) anObject; double area = aRectangle.getWidth() * aRectangle.getHeight(); return area; } } class Car { private double price; private double taxRate; Car(double price, double taxRate) { this.price = price; this.taxRate = taxRate; } public double getPrice() { return price; } public double getRate() { return taxRate; } } class CarMeasurer implements Measurer { public double measure(Object anObject) { Car aCar = (Car) anObject; double totalPrice = aCar.getPrice() * (1 + aCar.getRate()); return totalPrice; } } class Data { public static double average(Object[] objects, Measurer meas) // 前者提供數(shù)據(jù),后者提供方法 { double sum = 0.0; for (Object obj : objects) { sum = sum + meas.measure(obj); } if (objects.length > 0) { return sum / objects.length; } else { return 0; } } } public class callBackDemo { public static void main(String[] args) { Measurer areaMeas = new AreaMeasurer(); Rectangle[] rects = new Rectangle[] { new Rectangle(5, 10, 20, 30), new Rectangle(10, 20, 30, 40), new Rectangle(20, 30, 5, 15) }; double averageArea = Data.average(rects, areaMeas); System.out.println("average area is: " + averageArea); Measurer carMeas = new CarMeasurer(); Car[] cars = new Car[] { new Car(20000, 0.12), new Car(30000, 0.16), new Car(90000, 0.18), }; double averagePrice = Data.average(cars, carMeas); System.out.println("average price is: " + averagePrice); } }
五 運行
average area is: 625.0
average price is: 54466.666666666664
六 圖解
更多java相關內(nèi)容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。