Java的参数传递是「js按值传递参数」还是「按引用传递」

JAVA是按值传递还是按引用传递的,试试就知道JAVA是按值传递还是按引用传递的,试试就知道演讲往事百家号很多朋友在网上,包括面试时候一直会弄不清passbyvalue以及passbyreference,这个在不同语言上是不一样的。如同在Python中有的变量是可变的,有的是不可变的,而在java里面,所有的参数传递都是按值传递。pass-by-value(按值传递):传递参数会在内存中开辟新的空间来存储参数,离开函数体,不影响参数本身pass-by-reference(引用传递):引用传递,则函数体内和外指向同一个内存空间,里面改外面也会变。Java八种基本类型byte,short,int,long,float,double,char,boolean,char这八种基本类型只要记得函数内函数外完全无关就可以了。而主要需要理解的地方是关于非基本类型和string非基本类型像这样一个changeapple的函数被调用之后,apple的color是会改变的,但是不是说是按值传递吗?对的确是按指传递,但是在传递一个自定义类的时候,我们传递的是指向这个类内存空间的地址。所以就会变成下图这样:虽然我们是一个新的copy出来的apple但是我们指向的是同一个内存区域。String类型为什么要单独讲一下string类型,是因为它很容易被搞混。string也不是基本类型啊,为什么这段代码,string1的值就不会被改变呢?这不是和第二段的非常健类型冲突吗?那是因为java字符串有着不可变性,一个字符串创建后,一旦更改,等于是重新开了一块内存地址。之前我们调用change函数后,就类似上图,我们两个字符串指向同一个heap上的位置,之后string2改了内容后,等于指向别处去了。这是string的immutable特性导致的。所以千万不要认为string也是基本类型,不是这个原因,是不可变性。有没明白的可以继续讨论哦,接下来会对JAVA面试的一些常见容易搞错的题目进行20个题目的深度解析,有需要的朋友可以关注一下。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。演讲往事百家号最近更新:简介:专注于小企业对B2B信息发布技巧总结作者最新文章相关文章Java:按值传递还是按引用传递详细解说_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java:按值传递还是按引用传递详细解说
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩3页未读,
定制HR最喜欢的简历
你可能喜欢今天,我在一本面试书上看到了关于java的一个参数传递的问题:
java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?
&我毫无疑问的回答:&引用传递!&,并且还觉得自己对java的这一特性很是熟悉!
结果发现,我错了!
值传递!Java中只有按值传递,没有按引用传递!
回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人!
综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出!
先来看一个作为程序员都熟悉的值传递的例子:
Java代码&&
public&static&void&changeValue(int&x)&{&&
x&=&x&*2;&&
int&num&=&5;&&
System.out.println(num);&&
changeValue(num);&&
System.out.println(num);&&
答案显而易见,调用函数changeValue()前后num的值都没有改变。
由此做一个引子,我用图表描绘一个值传递的过程:
num作为参数传递给changeValue()方法时,是将内存空间中num所指向的那个存储单元中存放的值,即"5",传送给了changeValue()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就把num的值5传送给了这个存储单元中。此后,在changeValue()方法中对x的一切操作都是针对x所指向的这个存储单元,与num所指向的那个存储单元没有关系了!
自然,在函数调用之后,num所指向的存储单元的值还是没有发生变化,这就是所谓的&值传递&!值传递的精髓是:传递的是存储单元中的内容,而非地址或者引用!
接下来,就来看java中的对象参数是怎么传递的:
同样,先给出一段代码:
Java代码&&
class&person&{&&
public&static&String&name&=&"Jack";&&
public&static&void&changeName(Person&p)&{&&
p.name&=&"Rose";&&
public&static&void&main(String[]&args)&{&&
Person&person&=&new&Person();&&
System.out.println(person.name);&&
changeName(person);&&
System.out.println(person.name);&&
&答案应该大家都心知肚明:
第一次显示:&Jack&
第二次显示:&Rose&
方法用了一个对象参数,该对象内部的内容就可以改变,我之前一直认为应该是该对象复制了一个引用副本给调用函数的参数,使得该方法可以对这个对象进行操作,其实是错了!
http://www.cnblogs.com/clara/archive//2179493.html 写道
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。&
为什么这里是&值传递&,而不是&引用传递&?
我还是用图表描绘比较能解释清楚:
主函数中new 了一个对象Person,实际分配了两个对象:新创建的Person类的实体对象,和指向该对象的引用变量person。
【注意:在java中,新创建的实体对象在堆内存中开辟空间,而引用变量在栈内存中开辟空间】
正如如上图所示,左侧是堆空间,用来分配内存给新创建的实体对象,红色框是新建的Person类的实体对象,000012是该实体对象的起始地址;而右侧是栈空间,用来给引用变量和一些临时变量分配内存,新实体对象的引用person就在其中,可以看到它的存储单元的内容是000012,记录的正是新建Person类实体对象的起始地址,也就是说它指向该实体对象。
这时候,好戏上台了:
调用了changeName()方法,person作为对象参数传入该方法,但是大家特别注意,它传入的是什么!!!person引用变量将自己的存储单元的内容传给了changeName()方法的p变量!也就是将实体对象的地址传给了p变量,从此,在changeName()方法中对p的一切操作都是针对p所指向的这个存储单元,与person引用变量所指向的那个存储单元再没有关系了!
回顾一下上面的一个值传递的例子,值传递,就是将存储单元中的内容传给调用函数中的那个参数,这里是不是异曲同工,是所谓&值传递&,而非&引用传递&!!!
那为什么对象内部能够发生变化呢?
那是因为:p所指向的那个存储单元中的内容是实体对象的地址,使得p也指向了该实体对象,所以才能改变对象内部的属性!
这也是我们大多数人会误以为是&引用传递&的终极原因!!!
阅读(...) 评论()参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。
在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。
按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
1、对象是按引用传递的2、Java 应用程序有且仅有的一种参数传递机制,即按值传递3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
首先考试大来看看第一点:对象是按引用传递的  确实,这一点我想大家没有任何疑问,例如:  class Test01  {  public static void main(String[] args)  {  StringBuffer s= new StringBuffer("good");  StringBuffer s2=s;  s2.append(" afternoon.");  System.out.println(s);  }  }  对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。  如何解释&对象是按引用传递的&的呢?  这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?  程序运行的输出是:  good afternoon.  这说明s2和s是同一个对象。  这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)  再看看下面的例子:  class Test02  {  public static void main(String[] args)  {  int i=5;  int i2=i;  i2=6;  System.out.println(i);  }  }  程序的结果是什么?5!!!  这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递  class Test03  {  public static void main(String[] args)  {  StringBuffer s= new StringBuffer("good");  StringBuffer s2=new StringBuffer("bad");  test(s,s2);  System.out.println(s);//9  System.out.println(s2);//10  }  static void test(StringBuffer s,StringBuffer s2) {  System.out.println(s);//1  System.out.println(s2);//2  s2=s;//3  s=new StringBuffer("new");//4  System.out.println(s);//5  System.out.println(s2);//6  s.append("hah");//7  s2.append("hah");//8  }  }  程序的输出是:  good  bad  new  good  goodhah  bad  考试大提示: 为什么输出是这样的?  这里需要强调的是&参数传递机制&,它是与赋值语句时的传递机制的不同。  我们看到1,2处的输出与我们的预计是完全匹配的  3将s2指向s,4将s指向一个新的对象  因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容  7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?  Java 应用程序有且仅有的一种参数传递机制,即按值传递。  至此,我想总结一下我对这个问题的最后的看法和我认为可以帮助大家理解的一种方法:  我们可以将java中的对象理解为c/c++中的指针  例如在c/c++中:  int *p;  print(p);//1  *p=5;  print(*p);//2  1打印的结果是什么,一个16进制的地址,2打印的结果是什么?5,也就是指针指向的内容。  即使在c/c++中,这个指针其实也是一个32位的整数,我们可以理解我一个long型的值。  而在java中一个对象s是什么,同样也是一个指针,也是一个int型的整数(对于JVM而言),我们在直接使用(即s2=s这样的情况,但是对于System.out.print(s)这种情况例外,因为它实际上被?晃猄ystem.out.print(s.toString()))对象时它是一个int的整数,这个可以同时解释赋值的传引用和传参数时的传值(在这两种情况下都是直接使用),而我们在s.XXX这样的情况下时s其实就是c/c++中的*s这样的使用了。这种在不同的使用情况下出现不同的结果是java为我们做的一种简化,但是对于c/c++程序员可能是一种误导。java中有很多中这种根据上下文进行自动识别和处理的情况,下面是一个有点极端的情况:  class t  {  public static String t="t";  public static void main(String[] args)  {  t t =new t();  t.t();  }  static void t() {  System.out.println(t);  }  }
1.对象就是传引用2.原始类型就是传值3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。
阅读(...) 评论()java按值传递还是按引用传递详细解说_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java按值传递还是按引用传递详细解说
&&java按值传递还是按引用传递详细解说
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩3页未读,
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 js按值传递参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信