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

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

 

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

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

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

 

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值