Java内部类(5):应用例
2024-09-05 08:41:08
例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()
}
}
最新文章
- Linux_10个需要了解的Linux网络和监控命令(转)
- 什么时候加上android.intent.category.DEFAULT
- C/C++学习----C语言简介
- 使用js加载器动态加载外部Javascript文件
- beej&#39;s 网络编程 打包数据pack data
- 确实是非常实用的Ubuntu命令
- [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
- (Problem 35)Circular primes
- perl 处理perl返回的json
- 公钥\私人 ssh避password登陆
- Nginx + IIS
- AjaxPro2
- C++友元
- IOS开发中将定时器添加到runLoop中
- BZOJ4077 : [Wf2014]Messenger
- [Java] 绕过证书验证调 HTTPS 接口时报 “SSLHandshakeException: DHPublicKey does not comply to algorithm constraints”的解决办法
- Java 迭代器综述
- hexo 静态页面生成后页面打不开的问题
- 2013长春网赛1005 hdu 4763	Theme Section(kmp应用)
- 记录Activity启动时间 ActivityLifecycleCallbacks
热门文章
- AtCoder Beginner Contest 132 F Small Products
- mysql乐观锁总结和实践(转载)
- Linux文件系统之mv(重命名/移动文件)
- Error resolving template “pages”, template might not exist or might not be accessible by any of the configured Template Resolver 或者 springboot使用thymeleaf时报html没有结束标签
- 前端小白页面开发注意事项及小工具(html\css\js)
- PHP常见设计模式
- httpClient请求响应延迟
- xml------文件打开样式
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
- 进程控制块(PCB)