Java中的闭包与回调方法分析
本篇内容介绍了“Java中的闭包与回调方法分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域,用过这个定义 可以看出内部类是面向对象的闭包 因为他不仅包含外围类对象的信息 还自动拥有一个指向此外围类对象的引用 在此作用域内 内部类有权操作所有的成员 包括private成员;
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(); } }
输出:
other increment
1
2
1
2
Callee2 继承字MyIncrement 后者已经有一个不同的increment()方法并且与Incrementable接口期望的increment()方法完全不相关 所以如果Callee2继承了MyIncrement 就不能为了Incrementable的用途而覆盖increment()方法 于是这能使用内部类独立的实现Incrementable
内部类Closure实现了Incrementable 一提供一个放回Caller2的钩子 而且是一个安全的钩子 无论谁获得此Incrementbale的引用 都只能调用increment() 除此之外没有其他功能。
“Java中的闭包与回调方法分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341