Java 是值传递还是 引用传递?

本文深入探讨Java中的值传递概念,通过实例解释基本类型与引用类型的传递机制,剖析对象属性变化的过程。

刚刚在网上看了很多资料,初涉这方面 知识,总结 一下! 若有不妥之处 望指正!

其实 在Java中 存在的是 值传递。那你可能会问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案是:值传递。首先不解析这个问题。讲一下基础。

对于基本类型:比如int a=4;a是直接放在 栈里面的。其值就为4.

对于引用类型:比如String str="java";其实str是在栈里 ,其值 为"java"对象的引用,即地址值。所以理解这个之后你就可以往下看了!

对于str="java";str="sb";这俩行代码 的理解是什么?首先 str 指向 "java",之后str重新指向“sb”;注意原有的“java”并未改变。

public class Employee {
	public int age;
	public Employee(int a){
		age=a;
	}
	public static void changeEmployeeAge(Employee em){
		em.age=50;
	}
}
package string;

public class Testmain {
	static void  foo(String text){
		text="windows";
	}
	public static void main(String[] args){
		Employee employee=new Employee(10);
	
		Employee.changeEmployeeAge(employee);
		System.out.println(employee.age);
		//int a[]={2,5};
		//int[]b=a;
		//b[1]=10;
		//System.out.println(a[1]);
		String str="sbbbbb";
		foo(str);
		System.out.println(str);
	}
}

现在来解决这个问题:上面代码是这个问题的实例化。注意当employee 作为参数传递时 em 也同时获得了 其地址值,即em 和 employee 同时指向 employee这个对象

而em.age=50;则直接改变了 这个对象的值。所以 最后输出是50;没毛病的。

而若 你把 Employee 的changeEmployeeAge() 方法改为如下

package string;

public class Employee {
	public int age;
	public Employee(int a){
		age=a;
	}
	public static void changeEmployeeAge(Employee em){
		em=new Employee(50);
	}
}

那么 结果会是什么?答案是:并未改变 输出10;为什么呢?em指向 新的对象而就对象并未改变。employee还是指向之前的对象。(如果你深刻理解了我前面讲得基础的话)代码最好自己写一下 运行一下 (题外话 :如果我讲得有一点让你有收获的话 点个赞把! 我还没被赞过呢哭

### 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"); // 修改对象状态 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值