Java闭包概念
闭包又称词法闭包
闭包最早定义为一种包含<环境成分>和<控制成分>的实体.
解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。
解释二:闭包是函数和相关引用环境组成的实体。
注:<自由变量>:除了局部变量的其他变量
简单理解:闭包能够 将一个方法 作为 一个变量 去存储,这个方法有能力去访问所在类的自由变量。
Java中闭包实现
关键点:
如何用变量去存储方法?
java中能够保存方法的变量指的就是普通的对象
如何让这个普通对象能够访问所在类的自由变量?
纯天然的解决办法是:内部类。内部类能够访问外部类的所有属性及方法。
隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?
让内部类实现通用接口,然后将内部类对象向上转型为接口类型。
上述解决办法就是Java最常用的闭包实现办法(内部类+接口)
下面提供一个简单的实现
public class Milk { public final static String name = "纯牛奶";//名称 private static int num = 16;//数量 public Milk()
{
System.out.println(name+":16/每箱");
} /**
* 闭包
* @return 返回一个喝牛奶的动作
*/
public Active HaveMeals()
{
return new Active()
{
public void drink()
{
if(num == 0)
{
System.out.println("木有了,都被你丫喝完了.");
return;
}
num--;
System.out.println("喝掉一瓶牛奶");
}
};
} /**
* 获取剩余数量
*/
public void currentNum()
{
System.out.println(name+"剩余:"+num);
}
} /**
* 通用接口
*/
interface Active
{
void drink();
}
使用上述实现
public class Person { public static void main(String[] args) {
//买一箱牛奶
Milk m = new Milk(); Active haveMeals = m.HaveMeals(); //没事喝一瓶
haveMeals.drink();
//有事喝一瓶
haveMeals.drink(); //看看还剩多少?
m.currentNum();
} }
运行结果
纯牛奶:16/每箱
喝掉一瓶牛奶
喝掉一瓶牛奶
纯牛奶剩余:14
上述例子中,通过调用Active的方法实现对Milk私有变量num进行修改。
总结
1.实际项目中没怎么用过闭包,因此不能对他的好坏进行评论。
2.建议合理的使用闭包,不完全不使用,也不能滥用。
3.特别注意:闭包会导致资源不被回收,如上例,在main方法中将m设为null,使用haveMeals继续调用drink方法仍然会喝掉一瓶牛奶,说明Milk对象并没有被释放掉。
Java闭包概念的更多相关文章
- 深入理解Java闭包概念
闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关 ...
- javascript,jquery(闭包概念)(转)
偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- 一 JAVA整体概念以及安装部署
JAVA 基本概念 JVM(JAVA virtual machine)java虚拟机,是java的能跨平台的核心,java的跨平台实现,就是在各种系统中布置JVM,然后java应用运行在JVM中,相 ...
- Java分层概念(转)
Java分层概念(转) 对于分层的概念,似乎之间简单的三层,多了,就有点难以区分了,所以收藏了这个. ervice是业务层 action层即作为控制器 DAO (Data Access Object) ...
- Java基础概念语法
Java基础概念语法 注释 单行注释 //行注释说明 多行注释 /* 多行注释说明 */ 文档注释 /** *@author 程序的作者 *@version 源文件的版本 *@param 方法的参数说 ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
- 加深理解Java异常概念并熟记5个最常见的运行时异常
加深理解Java异常概念并熟记5个最常见的运行时异常 说明Error与Exception的联系和区别有哪些? 列举最常见的5个运用时异常. 1.Error和Exception的联系和区别: Error ...
随机推荐
- [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆
引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...
- HttpSession之表单的重复提交 & 验证码
如果采用 HttpServletResponse.sendRedirct() 方法将客户端重定向到成功页面,将不会出现重复提交问题 1.表单的重复提交 1). 重复提交的情况: ①. 在表单提交到一个 ...
- 【转】DataFrame合并
参考:python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca 横向合并(扩展列):merge,类似SQL的join,内连接,外连接等. 纵 ...
- pandas读写csv,并增加一列
为读取csv,并DataFrame增加一列,再自由组合列并保存到csv文件: import pandas as pd sourceFile='d:\person.csv' #person.csv包括i ...
- Rocket - devices - TLDeadlock
https://mp.weixin.qq.com/s/Zv4HE7zMBzHbsWGg3pa9fg 简单介绍TLDeadlock的实现. 1. TLDeadlock TLDeadlock是抽象类Dev ...
- Rocket - decode - Term
https://mp.weixin.qq.com/s/CbBWdTlc_DESlUzd8KFcSg 介绍Term类各方法的实现. 1. prime 表示一个项是否是质项,即这 ...
- Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
问题描述 70044与113148的最大公约数是多少? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. pac ...
- (Java实现) 洛谷 P1098 字符串的展开
import java.util.ArrayList; import java.util.Scanner; public class zifuchuandezhankai { static Array ...
- Java实现 LeetCode 473 火柴拼正方形
473. 火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到 ...
- 本地存储 localStorage
本地存储localStorage 概念:window对象下面的属性,html5新增的,将5M大小的数据存储本地的浏览器上面. 浏览器支持存储5M大小 本地存储localStorage特点 本地存储属于 ...