例1-闭包(Closure)

闭包是一个可调用的对象(通过Callback),它记录了一些信息,这些信息来自于创建它的作用域

 interface Incrementable {
void increment();
} class Callee1 implements Incrementable {
private int i = 0; @Override
public void increment() {
i++;
System.out.println(i);
}
} class MyIncrement {
public void increment() {
System.out.println("Other operation");
} static void f(MyIncrement mi) {
mi.increment();
}
} class Callee2 extends MyIncrement {
private int i = 0; @Override
public void increment() {
super.increment();
i++;
System.out.println(i);
} private class Closure implements Incrementable {
@Override
public void increment() {
Callee2.this.increment();
}
} Incrementable callBack() {
return new Closure();
}
} class Caller {
private Incrementable callbackReference; Caller(Incrementable callbackReference) {
this.callbackReference = callbackReference;
} void go() {
callbackReference.increment();
}
} /**
* 关键字: 内部类应用, 闭包(Closure)<br/>
* 1.闭包是一个可调用的对象(通过Callback),它记录了一些信息,这些信息来自于创建它的作用域<br/>
*/
public class Test007 { public static void main(String[] args) {
Callee1 c1 = new Callee1();
c1.increment(); //
Callee2 c2 = new Callee2();
MyIncrement.f(c2); // Other operation|1
Caller caller1 = new Caller(c1);
caller1.go(); //
Caller caller2 = new Caller(c2.callBack());
caller2.go(); // Other operation|2
}
}

例2-复杂情况下的调用顺序

 class Egg2 {

     protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
} public void f() {
System.out.println("Egg2.Yolk.f()");
}
} private Yolk y = new Yolk(); public Egg2() {
System.out.println("New Egg2()");
} public void insertYolk(Yolk yy) {
y = yy;
} public void g() {
y.f();
}
} class Test008Sub extends Egg2 {
public Test008Sub() {
System.out.println("AA");
insertYolk(new Yolk());
} public class Yolk extends Egg2.Yolk {
public Yolk() {
System.out.println("BigEgg2.Yolk()");
} public void f() {
System.out.println("BigEgg2.Yolk.f()");
}
}
} // 复杂情况下的调用顺序
public class Test008 {
public static void main(String[] args) {
new Test008Sub().g();
// Egg2.Yolk()
// New Egg2()
// AA
// Egg2.Yolk()
// BigEgg2.Yolk()
// BigEgg2.Yolk.f()
}
}

最新文章

  1. Linux_10个需要了解的Linux网络和监控命令(转)
  2. 什么时候加上android.intent.category.DEFAULT
  3. C/C++学习----C语言简介
  4. 使用js加载器动态加载外部Javascript文件
  5. beej&#39;s 网络编程 打包数据pack data
  6. 确实是非常实用的Ubuntu命令
  7. [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
  8. (Problem 35)Circular primes
  9. perl 处理perl返回的json
  10. 公钥\私人 ssh避password登陆
  11. Nginx + IIS
  12. AjaxPro2
  13. C++友元
  14. IOS开发中将定时器添加到runLoop中
  15. BZOJ4077 : [Wf2014]Messenger
  16. [Java] 绕过证书验证调 HTTPS 接口时报 “SSLHandshakeException: DHPublicKey does not comply to algorithm constraints”的解决办法
  17. Java 迭代器综述
  18. hexo 静态页面生成后页面打不开的问题
  19. 2013长春网赛1005 hdu 4763 Theme Section(kmp应用)
  20. 记录Activity启动时间 ActivityLifecycleCallbacks

热门文章

  1. AtCoder Beginner Contest 132 F Small Products
  2. mysql乐观锁总结和实践(转载)
  3. Linux文件系统之mv(重命名/移动文件)
  4. Error resolving template “pages”, template might not exist or might not be accessible by any of the configured Template Resolver 或者 springboot使用thymeleaf时报html没有结束标签
  5. 前端小白页面开发注意事项及小工具(html\css\js)
  6. PHP常见设计模式
  7. httpClient请求响应延迟
  8. xml------文件打开样式
  9. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
  10. 进程控制块(PCB)