局部变量和方法参数在jvm中的储存方法是相同的,都是在栈上开辟空间来储存的,随着进入方法开辟,退出方法回收。以32位JVM为例,boolean/byte/short/char/int/float以及引用都是分配4字节空间,long/double分配8字节空间。
在JVM内存模型中有,stack和heap的存在,但是更准确的说,是每个线程都分配一个独享的stack,所有线程共享一个heap。对于每个方法的局部变量来说,是绝对无法被其他方法,甚至其他线程的同一方法所访问到的,更无法修改。
当我们在方法中声明一个 int i = 0,或者 Object obj = null 时,仅仅涉及stack,不影响到heap,当我们 new Object() 时,会在heap中开辟一段内存并初始化Object对象。当我们将这个对象赋予obj变量时,仅仅是stack中代表obj的那4个字节变更为这个对象的地址。
上面中的传递?FunA传递了栈内存具体的值 num = 10000(FunA stack中存一份副本,形参), FunB传递了栈内num对象的地址 num = 0x000002(FunB stack中存一份副本,形参), FunC和FunB 一样中传递了栈内num对象的地址 num = 0x000002(但是对目标对象堆内存中的值做了修改)
如果是数据类型,会直接当栈中存储的基本值传递给了形式参数复制一份。如果是非基本数据类型,是把实际参数的引用的地址复制了一份,传递给了形式参数,简单说就是把实参对象引用的地址当做值传递给了形式参数。