值传递与引用传递-内存解析

[size=medium]以前自己就没怎么搞清楚值传递与引用传递的内部机制,近来发现好多面试题中都考到了它,决定真正弄懂它,所以在网上查了很多资料,最后再结合自己的理解,写一篇文件来做一下总结。

这里就结合一个常见的例子来做解析,User类源码如下:[/size]

class User {
private int id;
private String name;

public User(int _id, String _name) {
id=_id;
name=_name;
}

public void setId(int $id) {
id=$id;
}

public void setName(String $name) {
name=$name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public String toString() {
return id+" - "+name;
}
}


[size=medium] 再写一个测试类UserTest:[/size]

public class UserTest {
public static void main( String[] args) {
UserTest test=new UserTest();
int n=2;
User u1=new User(20,"Boy");
User u2=new User(21,"Girl");
test. changeId (n);
System.out.println ( "n is " + n);
test.changeName(u1);
test.changeIdName(u2);
System.out.println(u1.toString());
System.out.println(u2.toString());
}
public void changeId(int i) {
i=3;
}
public void changeName( User u) {
u=new User(1,"Test");
}
public void changeIdName( User u) {
u.setId(23);
u.setName ("My Name");
}
}


[size=medium] 为了真正弄清楚程序的执行过程,我觉得得先明白几个东西,也就是下面这张图里面的内容:
[img]http://dl.iteye.com/upload/attachment/308323/fd18a765-433f-382e-976a-a0d66011ca4e.gif[/img]

下面再来讲解程序在内存中的执行过程,首先从main函数的第一行开始,创建了一个UserTest对象,变量test指向了新new出来的UserTest对象,通过上面知道,局部变量存放在栈空间,所以执行完这句,在栈中就给test变量分配了一小块空间,同时在堆内存中也分配了一块空间用来存放new出来的UserTest对象,test指向了堆中对象,这就是所谓的引用;再往下面给一个变量赋值,同样是一个变量,在栈中分配一块空间,变量名为n,类型为int,值为2;下面创建了一个User对象,栈中给u1变量分配空间,堆中也分配一块内存给new出来的User对象,同样u1也指向了堆中new出来的User对象,这个对象中有两个成员变量id和name,但创建这个对象的时候,我们调用了这个对象的有参构造方法:[/size]
public User(int _id,String _name) {
id=_id;
name=_name;
}

[size=medium]那么方法是怎么执行的呢?方法里面的开参跟局部变量同等对待,在栈中分配_id和_name空间,它们的值分别是20和"Boy",然后通过赋值,就把它们的值传递给了User对象中的id和name,当这个方法构造方法调用完毕后,分配给这个方法的参数和内存全部消失,然后再给让其它人用。那么这个过程的执行流程图如下:
[img]http://dl.iteye.com/upload/attachment/308338/b2324861-0f7c-3fdc-90c5-c051a67e5704.gif[/img]

我觉得这个内存的分析,对我们学习程序是很有帮助的,我相信只要弄懂了内存,以后这方面再怎么样的面试题都难不到了。另外还要强调的是:
1.先要弄清程序存放在内存的哪些地方。
2.局部变量的存放位置,尤其方法里面的参数,方法执行完毕,为这个方法分配的参数和内存都将消失,把空间让给别人用。
3.新new出来的对象一定是放在堆中,如果一个对象没有了引用,也就会在适时被垃圾回收掉。
4.这个东西最好是自己动手画一画,一动手可能就全明白了。

由于程序执行是一个动态的过程,如果用语言描述清楚,需要花大量的篇幅,写了之后别人也不一定能看的懂,所以我做了一个PPT,比较全面的描述了这个程序在内存中的执行过程,不过由于本人PPT技术不咋的(呵呵),做的比较粗糙,希望大家都能看的懂。这篇文章是自己看过一些资料后的总结,自己难免会有理解疏漏的地方,希望大家不吝赐教。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值