回调是Java非常经典的用法,体现了Java的多态和动态绑定,回调指的是
接口的回调(有很多概念被学过的人简化的称呼,给初学者带来困惑,真是伤不起)。
网上关于回调的文章一大推,说法也很多,比如:
”
A对象调用了自己的方法a,方法a接收的参数是B接口的实例b,而在方法a中将执行接口B中的方法c。“
对于初学者来说,理解起来非常困难,学习的乐趣也没了。
在这先举个简单的例子(参考了知乎某位朋友的例子,想到好例子好难),大家看完例子再来理解就好了。
背景:在学校旁边有家奶茶店,里面有个服务员Lucy,奶茶店有奶茶、白开水、碧螺春等饮料提供。经常光顾奶茶店的有三类人,学生,老师还有在学校打工的工人。
学生最喜欢和奶茶,老师喜欢和碧螺春,工人因为比较累,喜欢和白开水,虽然喜好不同,但他们三种人去奶茶店都是去实现自己的需要的服务的。
于是coding如下代码:
interface NeedService{
public void server();
}
class Student implements NeedService{
@Override
public void server() {
System. out.println( "招待我喝奶茶" );
}
}
class Teacher implements NeedService{
@Override
public void server() {
System. out.println( "招待我喝碧螺春" );
}
}
class Worker implements NeedService{
@Override
public void server() {
System. out.println( "招待我喝白开水" );
}
}
服务员Lucy虽然比较漂亮,但是也比较笨,虽然她知道三种人都需要服务,但是她得等三种人说出自己的需求才知道给三种人上什么饮料。
抽象到代码就是服务员只能传入需要服务的接口
NeedService(
就是在这里,接口回调
)
,再调用
NeedService
的
server()
方法,她能做的就是这个。
public class Waiter {
//此处回调接口
void provideService(NeedService needService){
needService.server();
}
}
这时候回调就派上用场了,只要三种人实现了各自的server()方法(
重写
),就可以完美的解决这个问题了。
于是coding如下代码:
public class Waiter {
//此处回调接口
void provideService(NeedService needService){
needService.server();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Waiter waiterLucy = new Waiter();
waiterLucy.provideService( new Student());
waiterLucy.provideService( new Teacher());
waiterLucy.provideService( new Worker());
}
}
结果:
最后,分析下接口的写法,必须有重写和接口才能实现,看懂了这个例子,网上的概念看不看就无所谓了。