Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 690|回复: 0

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

[复制链接]

该用户从未签到

发表于 2011-8-3 23:19:49 | 显示全部楼层 |阅读模式
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域,用过这个定义 可以看出内部类是面向对象的闭包 因为他不仅包含外围类对象的信息 还自动拥有一个指向此外围类对象的引用 在此作用域内 内部类有权操作所有的成员 包括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() 除此之外没有其他功能
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-27 12:20 , Processed in 0.398470 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表