JAVA接口回调
接口回調(diào)是指:可以把使用實(shí)現(xiàn)了某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類(lèi)實(shí)現(xiàn)的接口的方法。實(shí)際上,當(dāng)接口變量調(diào)用被類(lèi)實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法,這一過(guò)程稱(chēng)為對(duì)象功能的接口回調(diào)。看下面示例:
interface People {
? ? ?void peopleList();
}
class Student implements People {
? ? ?public void peopleList() {
? ? ? ? System.out.println(\"I’m a student.\");
? ? ?}
}
class Teacher implements People {
? ? ?public void peopleList() {
? ? ? ? System.out.println(\"I’m a teacher.\");
? ? ?}
}
public class Example {
? ? ?public static void main(String args[]) {
? ? ? ? People a; // 聲明接口變量
? ? ? ? a = new Student(); // 實(shí)例化,接口變量中存放對(duì)象的引用
? ? ? ? a.peopleList(); // 接口回調(diào)
? ? ? ? a = new Teacher(); // 實(shí)例化,接口變量中存放對(duì)象的引用
? ? ? ? a.peopleList(); // 接口回調(diào)
? ? ?}
}
結(jié)果:
I’m a student.
I’m a teacher.
向上轉(zhuǎn)型:
Shape s=new Circle();?
這里,創(chuàng)建了一個(gè)Circle對(duì)象,并把得到的引用立即賦值給Shape。通過(guò)繼承,Circle就是一種Shape。
假設(shè)你調(diào)用基類(lèi)方法(它已在導(dǎo)出類(lèi)中被覆蓋):
s.draw();?
由于后期綁定(多態(tài)),將會(huì)正確調(diào)用Circle.draw()方法。
?
從實(shí)現(xiàn)了某接口的對(duì)象,得到對(duì)此接口的引用,與向上轉(zhuǎn)型為這個(gè)對(duì)象的基類(lèi),實(shí)質(zhì)上效果是一樣的。這些對(duì)象都可以調(diào)用基類(lèi)型提供的方法,對(duì)于接口來(lái)說(shuō)就是回調(diào)接口中的方法,對(duì)于父類(lèi)來(lái)說(shuō)就是調(diào)用父類(lèi)的方法。當(dāng)然在向上轉(zhuǎn)型的情況下,還牽涉到子類(lèi)重寫(xiě)(Override)父類(lèi)方法的情形。
?
Java回調(diào)
chendq@startimes.com.cn
?
?????? 接口回調(diào):可以把使用實(shí)現(xiàn)了某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類(lèi)實(shí)現(xiàn)的接口的方法。實(shí)際上,當(dāng)接口變量調(diào)用被類(lèi)實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法,這一過(guò)程稱(chēng)為對(duì)象功能的接口回調(diào)。
觀察者模式:是將觀察者和被觀察的對(duì)象分離開(kāi), 當(dāng)被觀察的對(duì)象產(chǎn)生一定變化的時(shí)候, 觀察者就會(huì)根據(jù)哪里產(chǎn)生的變化, 產(chǎn)生了變化, 而進(jìn)行相應(yīng)的處理.大部分觀察著模式是用接口回調(diào)的方法來(lái)實(shí)現(xiàn)的.
前者是一種體現(xiàn), 后者是一種用前者實(shí)現(xiàn)的模式, 相當(dāng)于后者調(diào)用前者, 他們兩個(gè)沒(méi)有可以比較的地方
?
接口回調(diào)的實(shí)例:
?
?
?
interface IPeople { void peopleList(); }
class Student implements IPeople {
?????? publicvoid peopleList(){ //doSomething… }
}
class Test {
?????? privateIPeople p;//聲明接口變量
?????? Test(IPeoplep){ this.p = p} //實(shí)例化,接口變量中存放對(duì)象的引用
?????? method(){
????????????? p.peopleList();? //接口回調(diào)
}
main(){
?????? IPeople p = new Student();
?????? new Test(p).method();
}
}
?
?
其他相關(guān)主題
1.內(nèi)部類(lèi):(Thinking InJava)每個(gè)內(nèi)部類(lèi)都能獨(dú)立地繼承自一個(gè)(接口的)實(shí)現(xiàn),所以無(wú)論外部類(lèi)是否已經(jīng)繼承了(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類(lèi)都沒(méi)有影響。內(nèi)部類(lèi)可以間接的有效地實(shí)現(xiàn)了“多重繼承”。即是說(shuō),內(nèi)部類(lèi)允許繼承多個(gè)非接口類(lèi)型(類(lèi)或抽象類(lèi))
Example:(抽象或具體的類(lèi),使用內(nèi)部類(lèi)實(shí)現(xiàn)多重繼承)
class D { }
abstract class E {? }
class Z extendsD {
??????? E makeE() return new E() { };}//匿名內(nèi)部類(lèi)
}
?
2.閉包:(Thinking InJava)是一個(gè)可調(diào)用的對(duì)象,它記錄了一些信息,這些信息來(lái)自創(chuàng)建它的作用域。與內(nèi)部類(lèi)概念相比較,可知,內(nèi)部類(lèi)是面向?qū)ο蟮拈]包。閉包(JavaEye)是具有閉合作用域的匿名函數(shù),是可以用作函數(shù)參數(shù)和方法參數(shù)的代碼塊。本質(zhì)上來(lái)說(shuō),一個(gè)閉包是一塊代碼,它們能作為參數(shù)傳遞給一個(gè)方法調(diào)用。
?
3.?
轉(zhuǎn)載于:https://www.cnblogs.com/lgh1992314/archive/2012/12/15/5835255.html
總結(jié)
- 上一篇: delphi编译缺少组件 imgedit
- 下一篇: STL源码剖析——P142关于list: