Java内部类(5):应用例
例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()
}
}
Java内部类(5):应用例的更多相关文章
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- 9)Java内部类(Inner Class)
内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...
- java 内部类(摘抄自网络)
Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...
- 【转】java内部类的作用分析
转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...
- 死磕Java内部类
Java内部类,相信大家都用过,但是多数同学可能对它了解的并不深入,只是靠记忆来完成日常工作,却不能融会贯通,遇到奇葩问题更是难以有思路去解决.这篇文章带大家一起死磕Java内部类的方方面面. 友情提 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java设计模式之单例
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
随机推荐
- C# 设置程序开机自启动
设置启动 //设置开机自启动 string path = Application.ExecutablePath; RegistryKey rk = Registry.LocalMachine; Reg ...
- Java项目出现的问题01----学习
0 运行环境 MyEcplise2016+Tomcat8.0 1 今天在html的表格提交跳转时发现,想要提交到自己写servlet程序中,却发现总是出错http://localhost:8080/T ...
- spring-boot web项目常用配置
一.对用户输入query参数过滤空字符串 使用 WebBindingInitializer 来对string类型参数进行过滤,但是这种方式只能处理query参数不能处理body参数 代码例子: /** ...
- springbooot+restful目录规则
dao是访问数据层,dto是数据传出层,po实体类
- hdu 5572 An Easy Physics Problem 圆+直线
An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- python 生成螺旋矩阵
对于任意 m*n 矩阵,将 1~m*n 的数字按照螺旋规则在矩阵中排列. 如 m=3,n=3,期望结果为: [ [ , , ], [ , , ], [ , , ] ] 以下代码支持方阵以及非方阵. c ...
- Django基础之CBV和FBV
我们之前写过的是基于函数的view,就叫FBV.还可以把view写成基于类的. 1. FBV版 def add_class(request): if request.method == "P ...
- Django-缓存问题无法创建表
新启的项目,应用不叫app01,也没有userinfo表: 由于缓存原因不能model里创建表报错: 解决办法: 删除init外的所有文件
- free 内存检测
free打印出的内存信息主要分为两种,一种是安装的内存,一种是用磁盘虚拟的内存,就是这里的Swap,相信装过Linux系统的同学肯定不陌生交换分区,这里Swap大小就是我们分区的时候分配的大小. 下面 ...
- Job for docker.service failed because the control process exited with error code. See
在Liunx中使用Docker, 注: Liunx使用的是在虚拟机下的centOS7版本在刚开始安装Docker时没有任何错误, 但是在后续的docker启动过程中, 出现以下问题: Job for ...