功能接口的行为和方法参考

Mic*_*ael 4 java generics java-8 functional-interface

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

public class Hey{
    public double bar;

    public Hey(){
        bar = 2.0d;
    }

    public double square(double num){
        return Math.pow(num , bar);
    }
}

Function<Double, Double> 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);
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 11

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

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

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

关于变量捕获,是的,方法引用hey::square是对特定对象(引用的那个hey)的实例方法的引用,因此在计算hey方法引用表达式以生成实例并使用它时将捕获变量的值何时apply被调用.