http://blog.csdn.net/caiwenfeng_for_23/article/details/8230432
闭包: Closure 是一种能被调用的对象,它保存了创建它的作用域的信息。
java并不能显式地支持闭包,但对于非静态内部类,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,
因此可以把非静态内部类当成面向对象领域的闭包。
回调: 就是允许客户类通过内部类引用来调用其外部类的方法。
案例:“内部类仿闭包”
一个较java的教师 ,既是老师也是程序员,他的工作既可以是教书,也可以是敲代码。
- interface Teachable //teachable接口
- {
- void work();
- }
- public class Programmer //程序员类
- {
- private String name;
- //Programmer类的两个构造器
- public Programmer(){}
- public Programmer(String name)
- {
- this.name = name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return this.name;
- }
- public void work()
- {
- System.out.println(name + "在灯下认真敲键盘...");
- }
- }
- public class TeachableProgrammer extends Programmer
- {
- public TeachableProgrammer(){}
- public TeachableProgrammer(String name)
- {
- super(name);
- }
- //教学工作依然由TeachableProgrammer类定义
- private void teach()
- {
- System.out.println(getName() + "教师在讲台上讲解...");
- }
- private class Closure implements Teachable
- {
- /*
- 非静态内部类回调外部类实现work方法,非静态内部类引用的作用仅仅是
- 向客户类提供一个回调外部类的途径
- */
- public void work()
- {
- teach();
- }
- }
- //返回一个非静态内部类引用,允许外部类通过该非静态内部类引用来回调外部类的方法
- public Teachable getCallbackReference()//返回的是Teachable类型
- {
- return new Closure();
- }
- }
这个TeachableProgrammer类既可以是老师,也可以是程序员,因为继承了Programmer,内部类实现了Teachable接口,通过内部类可以访问外部类的成员,调用了teach()方法,实现老师的work方法,程序员的work方法就是直接调用父类的work方法。
- public class TestTeachableProgrammer
- {
- public static void main(String[] args)
- {
- TeachableProgrammer tp = new TeachableProgrammer("李刚");
- //直接调用TeachableProgrammer类从Programmer类继承到的work方法
- tp.work();
- //表面上调用的是Closure的work方法,实际上是回调TeachableProgrammer的teach方法
- tp.getCallbackReference().work();
- }
- }