一 . 前言
正在看java編程思想,感覺對自己提升很大,重新總結(jié)下回調(diào)。
二.java 多態(tài)和向上轉(zhuǎn)型
下面的程序看起來有些奇怪,似乎對象都忘記自己的類型了,如果直接傳入Acar car=new Acar(); 可能更加直觀,但這樣如果car的種類較多,就會給代碼帶來很多負擔(dān)。 子類對象可以代替父類對象,這是多態(tài)所允許的
interface Car{
void name();
}
class Acar implements Car{
@Override
public void name() {
// TODO Auto-generated method stub
System.out.println("a");
}
}
class Bcar implements Car{
@Override
public void name() {
// TODO Auto-generated method stub
System.out.println("b");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test dsp=new Test();
Car car=new Acar();
dsp.getName(car);
}
public void getName(Car car) {
// TODO Auto-generated method stub
car.name();
}
}
三.回調(diào)函數(shù)
回調(diào)就是在類A中持有一個B類的引用,在A中調(diào)用B的方法receive()傳入其中一個參數(shù)為A類型
這樣A,B就可以互相調(diào)用了。
四.具體實現(xiàn)
舉個例子:學(xué)生去向老師詢問問題,老師有時間的時候,去告訴學(xué)生。
public interface CallBack {
//實現(xiàn)回調(diào)的接口
public void response(String qusetion);
}
public class Student implements CallBack{
//學(xué)生問老師問題
public void askTeacher(Teacher teacher,String question){
teacher.receive(this, question);
}
//得到老師的回復(fù)
@Override
public void response(String answer) {
// TODO Auto-generated method stub
System.out.println("The answer is"+answer);
}
//學(xué)生做別的事情
public void play() {
System.out.println("play....");
}
}
public class Teacher {
public void receive(CallBack callBack,String question){
System.out.println("The question is "+question);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//do other things
try {
//老師忙完之后回復(fù)學(xué)生
Thread.sleep(4096);
callBack.response("2");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student=new Student();
Teacher teacher=new Teacher();
student.askTeacher(teacher,"1+1=?");
student.play();
}
}