先来看这样一段代码,你认为它的运行结果是多少呢?
20和11还是20和10?
package org.example;
public class Main {
public static void main(String[] args) {
int a=10;
add(a);
System.out.println(a);
}
public static void add(int a){
int b=10;
System.out.println(a+b);
a=11;
}
}
答案是20和10,如果你猜对了请先不要窃喜,不妨继续往下看,检测一下自己是真的会还是仅仅猜对了
在Java中局部变量最终会被放在栈中,如下所示:
当add方法执行完毕,会将add方法所占用的栈的空间删除掉,如下所示:
因此最终输出的a的值其实是main函数中的a的值
Java的基础数据类型都是值类型,指针也是值类型,因而是直接存到内存,不是存地址去寻址
当add函数执行完毕,左侧栈所占用的内存就会被释放掉,但是右边堆所占用的内存并不会被随着函数调用结束而清空,因为我们无法确定是否还有其他的线程也引用堆中的对象,而需要使用GC垃圾回收机制完成