分析Java中的闭包与回调方法

开发 后端
本文介绍的是java中的闭包和回调方法,希望对你有帮助,一起来看。

关于闭包,我们之前介绍过相关的一些文章,比如:《Javascript闭包(closure) 深入浅出》、《C#中的闭包是怎么捕获变量的》和《深入理解Perl闭包及其应用》,大家可以对比着看一下,供参考。

闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域,用过这个定义 可以看出内部类是面向对象的闭包 因为他不仅包含外围类对象的信息 还自动拥有一个指向此外围类对象的引用 在此作用域内 内部类有权操作所有的成员 包括private成员;

Java代码

 

  1. interface Incrementable  
  2. {  
  3. void increment();  
  4. }  
  5. class Callee1 implements Incrementable  
  6. {  
  7. private int i=0;  
  8. public void increment()  
  9. {  
  10. i++;  
  11. System.out.println(i);  
  12. }  
  13. }  
  14. class MyIncrement  
  15. {  
  16. void increment()  
  17. {  
  18. System.out.println("other increment");  
  19. }  
  20. static void f(MyIncrement mi)  
  21. {  
  22. mi.increment();  
  23. }  
  24. }  
  25. class Callee2 extends MyIncrement  
  26. {  
  27. private int i=0;  
  28. private void incr()  
  29. {  
  30. i++;  
  31. System.out.println(i);  
  32. }  
  33. private class Closure implements Incrementable //内部类  
  34. {  
  35. public void increment()  
  36. {  
  37. incr();  
  38. }  
  39. }  
  40. Incrementable getCallbackReference()  
  41. {  
  42. return new Closure(); //新建内部类  
  43. }  
  44. }  
  45. class Caller  
  46. {  
  47. private Incrementable callbackRefference;  
  48. Caller(Incrementable cbh)  
  49. {  
  50. callbackRefference = cbh;  
  51. }  
  52. void go()  
  53. {  
  54. callbackRefference.increment();//调用increment()方法  
  55. }  
  56. }  
  57. public class Callbacks  
  58. {  
  59. public static void main(String [] args)  
  60. {  
  61. Callee1 c1=new Callee1();  
  62. Callee2 c2=new Callee2();  
  63. MyIncrement.f(c2);  
  64. Caller caller1 =new Caller(c1);  
  65. Caller caller2=new Caller(c2.getCallbackReference());//将内部类中的Closure赋给Caller  
  66. caller1.go();  
  67. caller1.go();  
  68. caller2.go();  
  69. caller2.go();  
  70. }  

 

输出:

other increment

1

2

1

2

Callee2 继承字MyIncrement 后者已经有一个不同的increment()方法并且与Incrementable接口期望的increment()方法完全不相关 所以如果Callee2继承了MyIncrement 就不能为了Incrementable的用途而覆盖increment()方法 于是这能使用内部类独立的实现Incrementable

内部类Closure实现了Incrementable 一提供一个放回Caller2的钩子 而且是一个安全的钩子 无论谁获得此Incrementbale的引用 都只能调用increment() 除此之外没有其他功能。

希望通过本文的介绍,能给你带来帮助。

【编辑推荐】

  1. 详细介绍Java EE开发四大常用框架
  2. Java 多线程同步问题的探究(一)
  3. Java 多线程同步问题的探究(二)
  4. 简单介绍Java EE容器
  5. 揭开Java EE开发框架之谜

责任编辑:于铁 来源: 互联网
相关推荐

2012-02-01 10:33:59

Java

2023-11-10 16:31:31

2016-11-01 09:18:33

Python闭包

2012-11-29 10:09:23

Javascript闭包

2023-11-02 08:53:26

闭包Python

2024-01-22 09:51:32

Swift闭包表达式尾随闭包

2010-06-29 08:39:25

Python闭包

2011-05-12 18:26:08

Javascript作用域

2021-10-26 13:18:52

Go底层函数

2020-08-11 09:47:30

JS闭包代码

2021-01-14 07:52:24

JavaScript回调函数

2022-04-18 08:34:29

回调函数命令解析

2009-07-22 07:43:00

Scala闭包

2010-06-13 14:44:26

Java 7闭包Lambda表达式

2009-11-09 15:58:07

WCF回调方法

2015-10-26 09:25:42

2010-01-27 13:26:28

Android事件侦听

2020-02-12 16:58:15

JavaScript前端技术

2011-08-24 17:09:35

LUA闭包函数

2023-10-26 07:47:35

JavaScript代码变量
点赞
收藏

51CTO技术栈公众号