持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
闭包是编程语言中一种常见的机制,并且在很多编程语言中都有这种特性。尤其是对于Java
程序员而言,这个名字对有些程序员有些陌生。但是在实际的编程中或多或少都接触到这个概念,在介绍闭包这个概念前首先要了解一下作用域的概念。
作用域
在编程语言中,程序就是通过指令来处理数据以得到预期的结果。程序中的每条语句对应处理的就是数据。但是程序中是由很多部分所组成,每个部分必然也会有自己要处理的数据。这自然就产生了作用域的概念。
- 数据在程序中对应的就是变量,程序中的指令处理的就是变量
- 不同的变量会有不同的可用范围,这就是作用域的概念
通过作用域可以将变量名称可以重复使用,而作用不用在不同作用域的变量一般情况下是不允许直接访问的。
class Test{
int x = 0;
public int f(int x) {
int y = x;
return y;
}
}
例如在上述代码段中,方法f
中的x
作用域只在f
内生效,而在Test
类中的x
在整个类中生效。这两个x
是具有不同的作用域的。
闭包
闭包的定义如下:
- 一个依赖于外部环境的
自由变量
的方法 - 这个方法能够访问外部环境的
自由变量
首先说明什么是自由变量,自由变量就是作用在当前方法自身作用域之外的变量。闭包就是能够读取其他方法内部变量的方法。通过闭包可以将方法的内部变量和外部变量联系起来,即可以访问当前方法内部作用域之外的变量。
在Java中闭包通过可以通过以下三种方式进行使用:
- 内部类: 内部类可以对它的外部类的变量进行访问。
public class OuterClass {
private int x = 5;
private class InnerClass {
private int y = 10;
public int add() {
return x + y;
}
}
}
- 匿名内部类: 匿名内部类可以对它的外部变量进行访问
public interface Fun() {
int add();
}
public class OuterClass {
public AnonInner getFun(final int x) {
final int y = 5;
return new Fun() {
public int add() {
return x + y;
}
}
}
}
- Lambda表达式:Lambda表达式是匿名内部类的一种简化写法,同样也支持闭包特性。
public void test(){
int x = 0;
new Thread(() -> System.out.println(x));
}