值类型相关函数内存调用:
先来看这样一段代码,你认为它的运行结果是多少呢?
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垃圾回收机制完成