自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分析Java中的閉包與回調(diào)方法

開發(fā) 后端
本文介紹的是java中的閉包和回調(diào)方法,希望對你有幫助,一起來看。

關(guān)于閉包,我們之前介紹過相關(guān)的一些文章,比如:《Javascript閉包(closure) 深入淺出》、《C#中的閉包是怎么捕獲變量的》和《深入理解Perl閉包及其應(yīng)用》,大家可以對比著看一下,供參考。

閉包是一個可調(diào)用的對象,它記錄了一些信息,這些信息來自于創(chuàng)建他的作用域,用過這個定義 可以看出內(nèi)部類是面向?qū)ο蟮拈]包 因為他不僅包含外圍類對象的信息 還自動擁有一個指向此外圍類對象的引用 在此作用域內(nèi) 內(nèi)部類有權(quán)操作所有的成員 包括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 //內(nèi)部類  
  34. {  
  35. public void increment()  
  36. {  
  37. incr();  
  38. }  
  39. }  
  40. Incrementable getCallbackReference()  
  41. {  
  42. return new Closure(); //新建內(nèi)部類  
  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();//調(diào)用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());//將內(nèi)部類中的Closure賦給Caller  
  66. caller1.go();  
  67. caller1.go();  
  68. caller2.go();  
  69. caller2.go();  
  70. }  

 

輸出:

other increment

1

2

1

2

Callee2 繼承字MyIncrement 后者已經(jīng)有一個不同的increment()方法并且與Incrementable接口期望的increment()方法完全不相關(guān) 所以如果Callee2繼承了MyIncrement 就不能為了Incrementable的用途而覆蓋increment()方法 于是這能使用內(nèi)部類獨(dú)立的實現(xiàn)Incrementable

內(nèi)部類Closure實現(xiàn)了Incrementable 一提供一個放回Caller2的鉤子 而且是一個安全的鉤子 無論誰獲得此Incrementbale的引用 都只能調(diào)用increment() 除此之外沒有其他功能。

希望通過本文的介紹,能給你帶來幫助。

【編輯推薦】

  1. 詳細(xì)介紹Java EE開發(fā)四大常用框架
  2. Java 多線程同步問題的探究(一)
  3. Java 多線程同步問題的探究(二)
  4. 簡單介紹Java EE容器
  5. 揭開Java EE開發(fā)框架之謎

責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2016-11-01 09:18:33

Python閉包

2023-11-02 08:53:26

閉包Python

2023-11-10 16:31:31

2024-01-22 09:51:32

Swift閉包表達(dá)式尾隨閉包

2012-11-29 10:09:23

Javascript閉包

2010-06-29 08:39:25

Python閉包

2012-02-01 10:33:59

Java

2011-05-12 18:26:08

Javascript作用域

2021-10-26 13:18:52

Go底層函數(shù)

2020-08-11 09:47:30

JS閉包代碼

2009-07-22 07:43:00

Scala閉包

2010-06-13 14:44:26

Java 7閉包Lambda表達(dá)式

2022-04-18 08:34:29

回調(diào)函數(shù)命令解析

2021-01-14 07:52:24

JavaScript回調(diào)函數(shù)

2020-02-12 16:58:15

JavaScript前端技術(shù)

2009-11-09 15:58:07

WCF回調(diào)方法

2011-08-24 17:09:35

LUA閉包函數(shù)

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2011-05-23 13:54:04

閉包
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號