什么是值传递和引用传递

一、什么是值传递和引用传递?

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

引用传递,是对于对象型变量而言的。传递的是该变量地址的一个副本,并不是该对象本身


链接:https://www.nowcoder.com/questionTerminal/b296e9e1c40542ec8677c1e452b6b576
来源:牛客网


public void add(int a) { int b = a; } 这个可以看作是值传递,a是基本数据类型,他把他的值传给了bpublic void add(Object obj) { Object objTest = obj; }这个可以看作是址传递,obj是引用数据类型,它是把栈中指向堆中的对象的地址值赋值给了objTest.这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值.

### Java值传递引用传递的概念及机制 #### 1. 值传递(Pass by Value) 在值传递中,方法接收到的是实际参数的副本。这意味着如果方法内部对参数进行了修改,这种修改不会影响到原始变量[^2]。 例如: ```java public class ValuePassingExample { public static void main(String[] args) { int num = 10; System.out.println("Before calling method: " + num); // 输出 10 modifyValue(num); System.out.println("After calling method: " + num); // 输出 10 } public static void modifyValue(int value) { value = 20; // 修改的是副本 System.out.println("Inside method: " + value); // 输出 20 } } ``` 在这个例子中,`modifyValue` 方法接收的是 `num` 的副本,因此对 `value` 的修改不会影响到原始变量 `num`。 #### 2. 引用传递(Pass by Reference) 严格来说,Java 并不支持真正的引用传递。在处理对象时,Java 实际上传递的是对象引用的副本。这意味着方法内部可以修改对象的状态,但不能改变对象引用本身指向的地址[^3]。 例如: ```java public class ReferencePassingExample { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); System.out.println("Before calling method: " + sb.toString()); // 输出 Hello modifyObject(sb); System.out.println("After calling method: " + sb.toString()); // 输出 HelloWorld } public static void modifyObject(StringBuilder str) { str.append("World"); // 修改对象状态 } } ``` 在这个例子中,`modifyObject` 方法接收到的是 `sb` 对象引用的副本,因此可以修改对象的状态(如追加字符串),但无法改变 `sb` 指向的对象[^3]。 #### 3. Java 中参数传递的方式 Java 中的所有参数传递都是通过值传递实现的。即使是对象作为参数传递时,传递的也是对象引用的副本,而不是引用本身[^4]。因此,在方法内部修改对象的状态会影响外部对象,但无法改变对象引用本身指向的地址。 #### 4. 总结 - **值传递**:方法接收到的是实际参数的副本,修改不会影响原始变量。 - **引用传递**:Java 不支持真正的引用传递,但在处理对象时,传递的是对象引用的副本,方法可以修改对象的状态,但不能改变引用本身指向的地址。 ### 示例代码 以下是一个综合示例,展示值传递引用传递的区别: ```java public class PassByExample { public static void main(String[] args) { int primitive = 10; System.out.println("Before primitive modification: " + primitive); // 输出 10 modifyPrimitive(primitive); System.out.println("After primitive modification: " + primitive); // 输出 10 StringBuilder sb = new StringBuilder("Hello"); System.out.println("Before object modification: " + sb.toString()); // 输出 Hello modifyObject(sb); System.out.println("After object modification: " + sb.toString()); // 输出 HelloWorld } public static void modifyPrimitive(int value) { value = 20; // 修改的是副本 } public static void modifyObject(StringBuilder str) { str.append("World"); // 修改对象状态 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值