Java 为空变量不会使方法引用无效
当我使用绑定到变量Java 为空变量不会使方法引用无效,java,nullpointerexception,method-reference,Java,Nullpointerexception,Method Reference,当我使用绑定到变量dog的方法引用时,为什么代码不抛出NullPointerException,我后来将null分配给该变量 我正在使用Java8 import java.util.function.function; 班犬{ 私人食品=10; 公共int eat(int num){ System.out.println(“eat”+num); 这个.食物-=num; 归还这个食物; } } 公共类methodreferencedemo{ 公共静态void main(字符串[]args){ 狗=
dog
的方法引用时,为什么代码不抛出NullPointerException
,我后来将null
分配给该变量
我正在使用Java8
import java.util.function.function;
班犬{
私人食品=10;
公共int eat(int num){
System.out.println(“eat”+num);
这个.食物-=num;
归还这个食物;
}
}
公共类methodreferencedemo{
公共静态void main(字符串[]args){
狗=新狗();
功能=狗::吃;
dog=null;
//我仍然可以使用方法参考
System.out.println(“仍然有”+函数.apply(2));
}
}
方法引用的dog::eat
捕获了dog
引用的实例,因此当调用函数.apply(2)
时,将对该实例执行eat
方法。dog
变量不再引用该实例并不重要。lambda表达式中使用的变量dog
仅在lambda表达式的范围内可见,因为它的定义和使dog
无效不会影响方法引用dog::eat
不使用具有相同功能的dog
的示例:
Function<Integer, Integer> function = new Dog()::eat;
Function=newdog()::eat;
函数是用对象dog
定义的,它与dog
变量本身无关。如果调用dog.something,将抛出NullPointerException,但是你的代码不是。相关的:也相关的传递在某种意义上更应该是相关的,因为它解释了变量和实例之间的差异。将变量置零不会使实例无效,只会使变量无效。再加上更重要的事实(正如其他人所指出的),方法引用不接受变量,而是它背后的实际实例。但是,是的,这就是为什么我只说相关的,而不是重复的或任何东西。但是当前的链接副本非常好,有JLS摘录。