闭包和回调

http://blog.csdn.net/caiwenfeng_for_23/article/details/8230432



闭包:    Closure   是一种能被调用的对象,它保存了创建它的作用域的信息

java并不能显式地支持闭包,但对于非静态内部类,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,

因此可以把非静态内部类当成面向对象领域的闭包。


回调:  就是允许客户类通过内部类引用来调用其外部类的方法。



案例:“内部类仿闭包”


  一个较java的教师 ,既是老师也是程序员,他的工作既可以是教书,也可以是敲代码。

[java]  view plain  copy
 print ?
  1. interface Teachable   //teachable接口  
  2. {  
  3.     void work();        
  4. }  
  5.   
  6.   
  7.   
  8. public class Programmer  //程序员类  
  9. {  
  10.     private String name;  
  11.     //Programmer类的两个构造器  
  12.     public Programmer(){}  
  13.     public Programmer(String name)  
  14.     {  
  15.         this.name = name;  
  16.     }  
  17.     public void setName(String name)  
  18.     {  
  19.         this.name = name;  
  20.     }  
  21.     public String getName()  
  22.     {  
  23.         return this.name;  
  24.     }  
  25.       
  26.     public void work()      
  27.     {  
  28.         System.out.println(name + "在灯下认真敲键盘...");  
  29.     }  
  30.       
  31. }  


[java]  view plain  copy
 print ?
  1. public class TeachableProgrammer extends Programmer  
  2. {  
  3.     public TeachableProgrammer(){}  
  4.     public TeachableProgrammer(String name)  
  5.     {  
  6.         super(name);  
  7.     }  
  8.       
  9.     //教学工作依然由TeachableProgrammer类定义  
  10.     private void teach()  
  11.     {  
  12.         System.out.println(getName() + "教师在讲台上讲解...");  
  13.     }  
  14.       
  15.       
  16.     private class Closure implements Teachable  
  17.     {  
  18.         /* 
  19.          非静态内部类回调外部类实现work方法,非静态内部类引用的作用仅仅是 
  20.          向客户类提供一个回调外部类的途径 
  21.          */  
  22.         public void work()  
  23.         {  
  24.             teach();  
  25.         }     
  26.     }  
  27.       
  28.     //返回一个非静态内部类引用,允许外部类通过该非静态内部类引用来回调外部类的方法  
  29.     public Teachable getCallbackReference()//返回的是Teachable类型  
  30.     {  
  31.         return new Closure();  
  32.     }  
  33.       
  34. }  



这个TeachableProgrammer类既可以是老师,也可以是程序员,因为继承了Programmer,内部类实现了Teachable接口,通过内部类可以访问外部类的成员,调用了teach()方法,实现老师的work方法,程序员的work方法就是直接调用父类的work方法。



[java]  view plain  copy
 print ?
  1. public class TestTeachableProgrammer  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         TeachableProgrammer tp = new TeachableProgrammer("李刚");  
  6.           
  7.         //直接调用TeachableProgrammer类从Programmer类继承到的work方法  
  8.         tp.work();  
  9.           
  10.         //表面上调用的是Closure的work方法,实际上是回调TeachableProgrammer的teach方法  
  11.         tp.getCallbackReference().work();  
  12.     }  
  13. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值