java中方法执行时的值传递

1-栈帧

简单的先说一下JVM的内存结构:简单的可以理解为两大块-堆(Heap)和栈(Stack);堆中主要存放类的实例化对象,线程共享的。虚拟机栈是线程私有的,描述的是线程方法的内容模型。存储的内容是栈帧。 在执行方法时,每一个执行的方法会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等。如果是方法(函数)嵌套着连续调用,会创建多个栈帧,栈帧的入栈和出栈执行的是LIFO(last-in-first-out),后进先出的方式。方法嵌套调用时,最底层的方法是最后创建的,执行完该方法后,基于该方法创建的栈帧就会弹出,销毁。如果该方法有返回值,会将返回值传入它下面的栈帧中。

2-形参和实参

方法调用的时候,方法的参数是如何传递的? 根据上面说的,一个方法在调动另一个方法时会创建一个新的栈帧来存储局部变量等信息, 在方法参数值的传递中,会将上一个方法中传入的变量复制到新的栈中。

根据java的数据类型分类,数据类型分为基本类型和引用类型。那方法调用时,参数的数据类型同样也是分为基本类型和引用类型。我们知道‘引用值’的变量实际存储的是指向类型实际内存地址(类实例化的对象存在堆空间内),代表某个对象的引用。该引用值是存放在栈空间内的。这个引用值大小一般为4byte。 

方法嵌套调用时,上层方法调动下层方法时所传递的参数就是基本类型和引用值。 实际操作就是将这些参数在栈内存空间中复制到新的栈帧中。 在下层方法执行完后,弹出栈帧,保存的局部变量销毁。

在下层方法执行过程中,如何对该方法的参数值进行修改,会影响上层方法中的参数值吗?==>我们上面说的值是复制到了新的栈帧中,在新的栈帧中对值做修改,是不会影响到下层栈帧中的数据的。

如果是引用类型的值,在下层方法中对-对象的属性值做了修改,会直接修改该对象实际内存地址上的对象值。那在上层方法再次根据引用值获取对象时,会发现对象中的属性值做了修改

3-不可变类(immutable)传递 

这里有一种特殊的对象, 在修改对象值时,原有的对象不会改变,而是会创建一个新的对象。这一类的对象称为‘不可变对象’;

JAVA中的String对象和基本类型的包装类都是不可变对象。 上面说到的下层方法修改对象值,上层方法访问该对象时,会发现对象的属性做了修改。 而对于不可变对象而言,下层方法在对‘不可变对象’做修改时,原有的对象不会改变,而是会产生新的对象。原有对象的引用值访问的仍然是原有对象。这种情况下,上层方法再次访问该对象时,会发现对象的值并未改变。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值