JAVA中值传递和引用传递的区别,参考他人回答。

本文详细探讨了Java中的值传递和引用传递。值传递时,基本类型的变量值会被复制到函数栈中,而引用传递时,对象的引用地址会被复制,导致函数内对对象的修改会影响到原对象。此外,文章还介绍了Java内存模型,包括栈内存和堆内存的使用,以及字符串常量池的概念。最后,提到了`==`在不同数据类型上的比较行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实,引用传递一开始是针对C的引用类型而言的,引用传递以外,有值传递和地址传递两种(即传值和传址),因为引用传递和地址传递都能达到改变形参外的实参的效果,所以,慢慢的地址传递也开始被很多人叫为引用传递。
形参的形就是一种所谓的形式,只是用于辅助说明函数的参数的类型,并没有实际的值,当函数被调用时,函数栈产生,形参也就存在于该栈的数据区(其实就是一个相对地址),当函数调用结束,栈撤销,形参也没了。实参是函数调用时实际传给函数的参数,值传递时,实参的值被复制到函数栈的形应的形参的数据区的地址里,地址(引用)传递时,实参的地址被复制到函数栈的形应的形参的数据区的地址里,函数对形参的操作,只是针对与数据区的那个形参的地址而操作,值传递时,因为修改的是形参地址的内容,所以不会对实参产生影响,地址(引用)传递时,修改形参的属性,并不是直接就把形参的地址里的内容覆盖(因为形参地址里存的只是个地址,没有什么属性),而是先从形参地址里取出里面的内容,即形参和实参共同指向的地址,然后再对那个地址进行操作,这样,因为实参也指向那个地址,所以实参的属性也会发生改变。对于重新给形参赋值,这时是在形参的地址里重新存入一个新的地址,此时形参与实参不再指向同一个地址,所以形参的任何变化都不会对实参造成影响。这也就是为什么在函数里不能改变实参的指向的原因。

Java的参数传递完全等同于赋值运算符的操作。

给方法内的参数用等于号赋值不会改变原来参数的值。

int num=20;

String str="hello"

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)

调用方法时发生了什么?参数传递基本上就是赋值操作。

https://zhuanlan.zhihu.com/p/27573287

JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。

以下是这几天栈和堆的学习记录和心得。得些记录下来。以后有学到新的,会慢慢补充。

一、先说一下最基本的要点

基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。

二、先明确以上两点,以下示例就比较好理解了


示例1

main()
  int x=1;
show ()
  int x=2

主函数main()中定义变量int x=1,show()函数中定义变量int x=1。最后show()函数执行完毕。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值