This question already has an answer here:
Why does the code not throw a NullPointerException
when I use a method reference tied to a variable dog
which I later assigned null
to?
I am using Java 8.
import java.util.function.Function;
class Dog {
private int food = 10;
public int eat(int num) {
System.out.println("eat " + num);
this.food -= num;
return this.food;
}
}
public class MethodRefrenceDemo {
public static void main(String[] args) {
Dog dog = new Dog();
Function<Integer, Integer> function = dog::eat;
dog = null;
// I can still use the method reference
System.out.println("still have " + function.apply(2));
}
}
The variable
dog
used at the lambda expression is visible only at the scope of the lambda expression since its definition and nullifying thedog
will not affect the method referencedog::eat
.An example without usage of
dog
with the same functionality:The
dog::eat
method reference captures the instance referenced bydog
, so when you callfunction.apply(2)
, theeat
method is executed for that instance. It doesn't matter that thedog
variable no longer references that instance.