function接口的行为和方法参考

当属于变量的方法的引用被破坏时会发生什么?

public class Hey{ public double bar; public Hey(){ bar = 2.0d; } public double square(double num){ return Math.pow(num , bar); } } Function square; whatsGonnaHappen: { Hey hey = new Hey(); square = hey::square; }//is hey still kept around because its method is being referenced? double ans = square.apply(23d); 

Scope是一个编译时概念,用于控制源代码中名称的使用位置。 来自JLS

声明的范围是程序的区域,声明中声明的实体可以使用简单的名称引用,只要它是可见的(第6.4.1节)。

名称hey仅限于whatsGonnaHappen标记语句的主体这一事实与hey运行时引用的实例是否是垃圾收集的候选者(我认为是您所担心的)无关。

关于变量捕获,是的,方法引用hey::square是对特定对象的实例方法的引用(由hey引用的方法),因此在对方法引用表达式求值时将捕获变量的值hey生成一个实例并在调用apply时使用它。

您的方法引用基本上等同于这样做:

 Hey hey = new Hey(); Function square = new DoubleDoubleFunction(hey); 

DoubleDoubleFunction类定义如下

 class DoubleDoubleFunction implements Function { private final Hey hey; public DoubleDoubleFunction(Hey hey) { this.hey = hey; } @Override public Double apply(Double num) { return hey.square(num); } } 

换句话说, square支持对Hey的引用。

我不知道eclipse,但是使用IntelliJ,您可以轻松地将方法引用和lambdas转换为匿名/静态嵌套/内部类,以查看正在发生的事情。 我发现这是一件非常有益的事情。