Java代码
interface Incrementable { void increment(); } class Callee1 implements Incrementable { private int i=0; public void increment() { i++; System.out.println(i); } } class MyIncrement { void increment() { System.out.println("other increment"); } static void f(MyIncrement mi) { mi.increment(); } } class Callee2 extends MyIncrement { private int i=0; private void incr() { i++; System.out.println(i); } private class Closure implements Incrementable //内部类 { public void increment() { incr(); } } Incrementable getCallbackReference() { return new Closure(); //新建内部类 } } class Caller { private Incrementable callbackRefference; Caller(Incrementable cbh) { callbackRefference = cbh; } void go() { callbackRefference.increment();//调用increment()方法 } } public class Callbacks { public static void main(String [] args) { Callee1 c1=new Callee1(); Callee2 c2=new Callee2(); MyIncrement.f(c2); Caller caller1 =new Caller(c1); Caller caller2=new Caller(c2.getCallbackReference());//将内部类中的Closure赋给Caller caller1.go(); caller1.go(); caller2.go(); caller2.go(); } } |
输出
otherincrement
1
2
1
2
Callee2继承字MyIncrement后者已经有一个不同的increment()方法并且与Incrementable接口期望的increment()方法完全不相关所以如果Callee2继承了MyIncrement就不能为了Incrementable的用途而覆盖increment()方法于是这能使用内部类独立的实现Incrementable
内部类Closure实现了Incrementable一提供一个放回Caller2的钩子而且是一个安全的钩子无论谁获得此Incrementbale的引用都只能调用increment()除此之外没有其他功能。