首先我确实调查了这一点。我在这里找到了同样的问题,但是关于C ++:What happens to unused function return values?
我对Java很感兴趣(虽然这个帖子确实很有趣)。
普遍的共识是,没有任何事情真的发生,如果有什么事情在以后被覆盖。这个线程与java有什么不同吗?
(链接会受到赞赏,因为我可以想象可能会发生什么,但想要一些证据和细节。而且我还要寻找更深入的东西"它没有被设置为变量")
答案 0 :(得分:9)
编译器发现它没有被使用,只是将(返回)堆栈上的值保留为未分配,即删除它。如果您指定它但不使用它,它将一直存在,直到此引用不再使用。
请参阅随附的屏幕截图。 Eclipse和字节码插件。
在L0下,您可以看到存储了concat调用的返回值(ASTORE 1)。在L1中的相同调用(在Java中未被使用或分配)仅使用POP进行处理,它也被从堆栈中移除并消失。
希望有所帮助。
答案 1 :(得分:3)
如果我们编译程序
public class Test {
static int m() {
return 42;
}
public static void main(String[] args) {
m();
}
}
然后用
检查生成的字节码“C:\ Program Files \ Java \ jdk1.8.0_05 \ bin \ javap.exe”-verbose Test.class
我们在main()中看到以下内容:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: invokestatic #18 // Method m:()I
3: pop
4: return
LineNumberTable:
line 10: 0
line 11: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 args [Ljava/lang/String;
正如我们所看到的,编译器发出pop
指令,指示JVM丢弃该值。
在机器代码中,这意味着JVM可以自由地重用内存位置(或cpu寄存器)来保存其他变量。