介面回撥的原理:介面變數 呼叫 被類實現的介面的方法

n8765發表於2015-05-12

其目地都是抽象。通過訪問父類或介面的方法(公共)達到一種對具體實現的封裝。對於介面的使用者來說,不需要關心實現細節。提高內聚,降低不必要的耦合。介面回撥是指:可以把使用實現了某一介面的類建立的物件的引用賦給該介面宣告的介面變數,那麼該介面變數就可以呼叫被類實現的介面的方法。實際上,當介面變數呼叫被類實現的介面中的方法時,就是通知相應的物件呼叫介面的方法,這一過程稱為物件功能的介面回撥。看下面示例。

interface People {
    void peopleList();
}
 
class Student implements People {
    publicvoid peopleList() {
       System.out.println("I’m a student.");
    }
}
 
class Teacher implements People {
    publicvoid peopleList() {
       System.out.println("I’m a teacher.");
    }
}
 
publicclass Example {
    publicstaticvoid main(String args[]) {
       People a; // 宣告介面變數
       a = new Student(); // 例項化,介面變數中存放物件的引用
       a.peopleList(); // 介面回撥
       a = new Teacher(); // 例項化,介面變數中存放物件的引用
       a.peopleList(); // 介面回撥
    }
}

結果:
I’m a student.
I’m a teacher.
再來看看向上轉型(upcasting)的概念。
2.什麼是向上轉型[1]
 
Shape s=new Circle();
這裡,建立了一個Circle物件,並把得到的引用立即賦值給Shape。通過繼承,Circle就是一種Shape
假設你呼叫基類方法(它已在匯出類中被覆蓋):
s.draw();
由於後期繫結(多型),將會正確呼叫Circle.draw()方法。
3Java中的跨類引用
java裡面,關於跨類引用,有兩條規則應該記住:
1)如果a是類A的一個引用,那麼,a可以指向類A的一個例項。或者說指向類A的一個子類,這是向上轉型的情形。
2)如果a是介面A的一個引用,那麼,a必須指向實現了介面A的一個類的例項。這是介面回撥的情形。
java裡面,向上轉型是自動進行的,但是向下轉型卻不是,需要我們自己定義強制進行.
class B extends A{}
 
publicclass A {
    publicstaticvoid main(String[] argts){
       A a1=new A();
       A a2=new B();//Upcasting向上轉型
       B b1=new B();
       B b2=(B) new A();//DownCasting向下轉型,[注意]:此處(B)進行了強制轉換!
    }
}
4.向上轉型與介面回撥的區別
從實現了某介面的物件,得到對此介面的引用,與向上轉型為這個物件的基類,實質上效果是一樣的。這些物件都可以呼叫基型別提供的方法,對於介面來說就是回撥介面中的方法,對於父類來說就是呼叫父類的方法。當然在向上轉型的情況下,還牽涉到子類重寫(Override)父類方法的情形。


相關文章