Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为空变量不会使方法引用无效_Java_Nullpointerexception_Method Reference - Fatal编程技术网

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摘录。