/**
* 书本:《Thinking In Java》
* 功能:关于java中的闭包与回调,这里回调区别于C++,C++中回调的话寄托于指针
* 文件:Callbacks.java
* 时间:2015年4月3日20:26:43
* 作者:cutter_point
*/
package Lession10innerclasses;
import static net.mindview.util.Print.*;
//创建一个接口,包含一个函数
interface Incrementable
{
void increment();
}
//接口中没有上面特别的地方,实现这个接口很简单,直接覆盖方法就可以了
class Callee1 implements Incrementable
{
private int i = 0;
@Override
public void increment()
{
++i;
print(i);
}
}
//然后我们要有一个类,里面有一个和上面接口一样的方法,只是具体实现的方式不一样
class MyIncrement
{
public void increment() { print("Other operation"); }
static void f(MyIncrement mi) { mi.increment(); }
}
//如果我们必须继承上面的MyIncrement的话,那么上面那个里面已经有了具体的方法实现了,如果我们把它覆盖的话,那么上面的那个的功能就不能用了
class Callee2 extends MyIncrement
{
private int i = 0;
public void increment()
{
super.increment(); //实现父类的这个方法,然后再是自己的方法
++i;
print(i);
}
//如果自己也想有一个对应的increment方法的话,那么就用内部类实现
private class Closure implements Incrementable
{
void test() {}
@Override
public void increment()
{
Callee2.this.increment(); //这个调用的是Callee2,也就是外部类的方法
}
}
Incrementable getCallbackReference()
{
return new Closure();
}
}
//为了调用increment函数,我们建立一个对象,专门调用函数的调用者
class Caller
{
private Incrementable callbackReference;
Caller(Incrementable cbh) { callbackReference = cbh; }
void go() { callbackReference.increment(); }
}
public class Callbacks
{
public static void main(String [] args)
{
Callee1 c1 = new Callee1();
Callee2 c2 = new Callee2();
MyIncrement.f(c2);
System.out.println("------------------------");
Caller caller1 = new Caller(c1);
Caller caller2 = new Caller(c2.getCallbackReference());
caller1.go();
caller1.go();//第二次调用的时候变成了2
System.out.println("------------------------");
caller2.go(); //还是回到了c2的increment()调用了,因为在c2.getCallbackReference()里面又回来调用了外部类,也就是c2的内部类的外部类,就是c2
caller2.go();
}
}
输出:
Other operation obj1
1 obj1
------------------------
1 obj1
2 obj1
------------------------
Other operation obj1
2 obj1
Other operation obj1
3 obj1
里面caller2.go()的注释我都觉得莫名其妙,真TM绕口,哎,java编程思想里面感觉好多这种绕来绕去的代码= =,我又不敢说不实用,不然我觉得绝壁有一群人出来喷我。。。