注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

Java传值还是传引用的理解  

2012-12-16 11:39:16|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"
这是外国的一位大牛说的。
其实嘛,java中所有的传递都是传值

public class Pass {
public int test;
public Pass(int i)
{
this.test=i;
}
public void setTest(int test) {
this.test = test;
}

public int getTest() {
return test;
}
}
public static void swap(Pass a,Pass b)
{
Pass temp=a;
a=b;
b=a;


public static void main(String[] args) {
// TODO Auto-generated method stub
Pass a=new Pass(1);
Pass b=new Pass(2);
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println(a);
System.out.println(b);


这里使用完swap以后你会发现这时候你分别输出a和b的值,他们并不会发生改变。这就应用到了上面那位大牛说的话了,我们在分别声明a和b的时候是引用形式的,可以这样理解,jvm把a指向内存中存储1的数值的那片区域。而当我们把a和b当作参数传递的时候实际上这个引用是按照值传递来传输的,也就是说传递给函数的值是这两个引用的副本。在swap中对两个副本进行操作,操作完是不会对原始数据产生影响的。

public static void swap(Pass a,Pass b)
{

int temp=a.test;
a.test=b.test;
b.test=temp;

但是这样操作的话再次输出你就会发现他们的值发生了交换,这是因为啥呢,原因就是我们虽然传递的是a和b的引用,我们在函数执行完以后是无论如何也不能够改变a和b的值的(a和b是引用);但是a和b却是可以操纵其指向的那片内存的内容。
所以说也就可以简单的记住几句话,
java在传递普通类型时产生的效果相当于c++中的传值操作,而在传递对象时虽然传递的是值(引用的值),产生的效果相当于c++中的传递应用,因为这个传递的引用的值是可以操纵其所指向的内存区域中的变量的值的。
  评论这张
 
阅读(113)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017