public interface Adjustable{
/***調節溫度***/
public void adjust(int temperature);
}
public class Base{
/***調節速度***/
private int speed;
public void adjust(int speed){
this.speed=speed;
}
}
在接口Adjustable和Base類中都定義了ajust()方法,這兩個方法的參數簽名一樣,但是有着不同的功能。
如果一個Sub類同時要具有調節溫度和速度的功能,那麼需要繼承Base類和實現Adjustable接口。
public class Sub extends Base implements Adjustable{
private int temperature;
public void adjust(int temperature){
this.temperature = temperature;
}
}
Sub類實現了Adjustable接口中的adjust()方法,並且將Base類中的adjust()方法給覆蓋了。所以沒有達到目的。可以使用內部類來解決這個問題
public class Sub extends Base{
private int temperature;
private void adjustTemperature(int temperature){
this.temperature = temperature;
}
private class Closure implements Adjustable{
public void adjust(int temperature){
adjustTemperature(temperature);
}
}
public Adjustable getCallBackReference(){
return new Closure();
}
}
Sub類採用瞭如下措施:
1.定義一個private 類型的adjustTemperature()方法,該方法實現了調節溫度的功能,爲了避免覆蓋Base類的adjust()方法,故意用了不同的名字。
2.定義了一個private類型的實例內部類Closure,該類實現了Adjustable接口,在這個類的adjust()方法中,調用Sub外部類的adjustTemperature()方法。
3.定義了getCallBackReference()方法,該方法返回Closure類的實例。
Sub = new Sub();
Adjustable ad = sub.getCallBackReference();
ad.adjust(15);
回調實質上是指一個類儘管實際上實現了某種功能,但是沒有直接提供相應的接口,客戶類可以通過這個類的內部類的接口來獲得這種功能。這個內部類本身並沒有提供真正的實現,僅僅調用外部類的實現。可見回調充分發揮了內部類所具有的訪問外部類的實現細節的優勢。