java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

java中的方法在内存中的表现形式

 

java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Demo4.java------->javac 工具将.java文件翻译成Demo.class的二进制文件----------->再通过jre中的java工具 以及类加载器,将.class文件加载进--------------------->jvm虚拟机.

    在jvm虚拟机中会加载到方法区中,在方法区可以理解为有个缓冲区,然后会先“进栈”主方法里面的所有内容,主方法会先加载进栈内存(因为java程序一定是从主方法开始)栈内存会分配一些空间去执行这个方法这个过程叫做“进栈”,暂时称为”栈帧1“,然后主方法中包含了另一个方法,另一个方法再加载进栈中,称为“栈帧2”,在栈中的运行模式是先进后出,所以在栈帧2所在的方法执行完后,会进行弹栈操作,腾出栈中的内存空间,栈帧2的内容就被垃圾回收了。然后继续执行栈帧1的后续内容。

 

java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

-----------------------------------------------------------------------------(图一)--------------------------------------------------------------------------------

 

形参的改变对实参有影响吗?

稍微想一下这个问题,好像当自定义方法中的参数和主方法有关联时,应该是会影响到主方法中的实参。那么用个例子来试试。

java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

--------------------------------------------------------------------------------(图二)----------------------------------------------------------------------------

结果显而易见,按理来说如果形参影响实参得话,那么“4”应该是20才对。为社么会出现这个情况呢?

在java底层来看,就是栈内存中的操作相关,(上面的图1)当方法从方法区中进栈时,明显栈内存给他们分配了不同的空间,而且当自定义方法执行结束后,自定义方法将会被进行“弹栈”操作,从而形参无法影响到实参。也可以说,自定义方法与main方法没有直接的关联。

所有结论就是:形参是基本数据类型时,形参的改变无法影响main中实参的内容。

 

形参是引用数据类型呢?那形参改变对实参有影响吗?

在经过上面的举例经过后,似乎这也不好回答。我们再来举个栗子;

java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

---------------------------------------------------------------------(图三)----------------------------------------------------------------------------------------

通过这个例子,似乎本应该不影响main中的实参才对,为什么这次又改变了呢?

因为------->堆内存中的空间是new创建的数据存储的空间。

所以程序的经过就不仅仅是进栈弹栈的操作了。

 

java学习第一周,java中的方法在内存中的表现形式。以及形参是基本数据类型,那形参改变对实参有影响吗?形参是引用数据类型呢?

因为new创建的是引用数据类型,所以arr这个数组是有地址值的,当arr进入到method1方法中,就是将new在堆内存中创建的内存空间的地址传给了method1方法,并且在method1中改了arr的数据,数据改了但是地址没有改变,所以当method1方法弹栈后,他的生命周期结束了,但是在堆内存中arr的数据改变了,地址并没有改变。所以当main方法引用arr的地址值时,就输出了改变后的数据。

所以结论是:形参是引用数据类型时,形参的改变会影响main中实参的内容。