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