Java值传递的机制

Java中所有的方法都是值传递,我们得到的是原参数的副本,而不是原件。所以改变复印件对原参数无影响。
下面举例说明一下。
public class User4 {
int id;
String name;
String pwd;
public User4(int id,String name) {
this.id=id;
this.name=name;
}
public void testTransfer(User4 u) {
u.name=“你好”;

}
public class User4 {
int id;
String name;
String pwd;
public User4(int id,String name) {
	this.id=id;
	this.name=name;
}
public void testTransfer(User4 u) {
	u.name="你好";
	
}
	}

}
解释为何输出值为你好:
因为当User4方法创建一个新对象i时,堆区里已经建立了i对象并且id=1,name=xixi;这时我们调用了testTransfer()方法,将i对象的地址传给了方法里的局部变量u,此时u的地址和i的地址为一个地址,而方法里我们给u.name赋值为你好,此时堆里的对象名字变为你好,最后输出i.name为你好。(id、name等属性都是在栈里)
public class User4 {
int id;
String name;
String pwd;
public User4(int id,String name) {
this.id=id;
this.name=name;
}
public void testTransfer(User4 u) {
u.name=“你好”;

}
public void testTransfer1(User4 u) {
	u=new User4(2,"不好");
	
}
public static void main(String[] args) {
	User4 i =new User4(1,"xixi");
	i.testTransfer(i);
	System.out.println(i.name);
	i.testTransfer1(i);	
	System.out.println(i.name);
	
}

}
解释为何输出值为你好和你好:
因为当User4方法创建一个新对象i时,堆区里已经建立了i对象并且id=1,name=xixi;这时我们调用了testTransfer()方法,将i对象的地址传给了方法里的局部变量u,此时u的地址和i的地址为一个地址,而方法里我们给u.name赋值为你好,此时堆里的对象名字变为你好,最后输出i.name为你好。
往下执行testTransfei1()方法,将i赋值给testTransfer1()方法里的局部变量u,此时第一部新建的对象u已经消失,因为testTransfer()方法已经执行完毕,所以此时的u为testTransfer()里的u。此时将i的地址赋给testTransfer1()方法里的局部变量u,此时i的地址等于testTransfer1()里的u的地址。
执行方法,因为testTransfer1()方法里已经新建了一个u对象。所以此时在堆里需要在新建一个对象,这个对象已经改变,所以此时的对象地址也已经改变(因为是新建的对象)。假设此时的i地址为123,新建u对象地址为124,之前testTransfer()里的u地址因为与i地址相同所以也为123,而此时u新创建完对象之后的地址已经变为124。最后输出的为i.name,而i的地址仍为123所以名字不变。

(第一次写博客如果有大佬,希望将错误的地方指出来,谢谢OVO。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值