什么是值传递和引用传递

引用传递等于是传递了一个句柄

Java是值传递

值传递是对于基本类型而言的,所传递的是一个基本数据类型的副本,改变副本不改变原变量

引用传递一般是对于对象变量类型而言的,传递的是该对象地址的一个副本,而不是源对象本身,所以引用传递的对象改变会改变源对象。

参考:

https://juejin.im/post/5bce68226fb9a05ce46a0476

如果传递的是primitive基本数据类型,那么传过去的就是一个副本内容,原地址内容并没有发生改变,传过去由实参变成了形参,形参的变化并不会影响到原来实参所指向的地址的内容。

如果传递的是对象,那么其实就把一个句柄传过去了,这个句柄指向一个地址,这个地址代表了对象在堆中存储的位置,如果此时不作任何改动就对该句柄进行操作,那么也就修改了堆中对象的内容,如果将该句柄指向了一个新对象的地址,那么之后所有的操作都是对这个新对象所作的,并不会影响堆中原来对象。

至此,可以说java中的传递都是值传递。传递的都是一个句柄一个指针,指向一个地址,该地址可以保存一个基本数据类型,也可以保存另一个地址指向堆中真实的对象

值传递引用传递可以用生活中的例子来通俗理解。 值传递就好比你要朋友分享一本书的内容,你不是把书直接给朋友,而是把书里的内容抄写到一张纸上给朋友。朋友看到的是你抄给他的内容,即使朋友在这张纸上做了什么修改,比如画了个标记,原来的那本书也不会有任何改变。在编程里,基本数据类型的传递就是值传递,像整数、字符等,传递的是实际的值,接收方对这个值做修改不会影响原来的值。比如你有一个变量`int a = 10`,把`a`的值传递给另一个变量`b`,之后`b`的值改变,`a`的值不会变。 引用传递就像是你朋友分享一本书,你直接把这本书的地址(比如书放在图书馆的哪个书架的哪个位置)告诉朋友,朋友根据这个地址就能找到这本书。朋友对这本书做的任何改变,比如撕掉一页,下次你再去看这本书时,它就是被朋友改动后的样子了。在编程里,引用数据类型的传递就是引用传递,像对象等,传递的是对象的引用(可以理解为对象的地址),接收方对这个引用指向的对象做修改,原来的对象也会改变。例如上述引用中的代码,`Order o1 = new Order();`创建了一个`Order`对象,`Order o2 = o1;`把`o1`的引用传递给`o2`,`o1``o2`指向堆空间中同一个对象实体,修改`o2`的属性,`o1`对应的属性也会改变[^1]。 ```java // 值传递示例 public class ValuePassingExample { public static void main(String[] args) { int a = 10; changeValue(a); System.out.println("a 的值: " + a); } public static void changeValue(int num) { num = 20; } } // 引用传递示例 class Order { int orderId; } public class ReferencePassingExample { public static void main(String[] args) { Order o1 = new Order(); o1.orderId = 1001; changeOrder(o1); System.out.println("o1.orderId: " + o1.orderId); } public static void changeOrder(Order order) { order.orderId = 2001; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值