欢迎来到天天文库
浏览记录
ID:62033712
大小:16.50 KB
页数:3页
时间:2021-04-15
《Java中的值传递和引用传递的区别.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、java中值传递和引用传递区别2011-07-09 18:48【转】java中值传递和引用传递区别java中的八大基本数据类型:intlongfloatdouble short byte charboolean看 似一样的方法,程序输出的结果却不太一样.changeObj()方法真正的把输入的参数改变了,而changePri()方法对输入的参数没有任何的改变。从这个例子知道Java对对象和基本的数据类型的处理是不一样的.和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数
2、的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。ﻫ这种方式的参数传递 被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递”,也就是说仅仅传递了对象的一个”引用”,这个"引 用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象 的直接操作。ﻫclassMyDemo{ﻫpublicstatic void operate(StringBufferx,StringBuffer y) {ﻫx.append(y);ﻫy =x;ﻫSystem.ou
3、t。println(x+",” +y);}ﻫpublic staticvoidmain(String[]args){StringBuffera =newStringBuffer("A”);ﻫStringBufferb=newStringBuffer("B");operate(a,b);System。out。println(a +",”+b);ﻫ}ﻫ}结果:ﻫAB,ABAB,B解释:ﻫ很明显你这里传递的是地址(引用)传递2个StringBuffer对象!ﻫ注意啦:x会指向a所指向的内存(可以理解为都指向A),y会指向b所指向的内存,(可以理解为都指向B)ﻫx.append(y);//这句
4、话把y指向的值追加给x指向的值,这个时候x和a 指向的内存都是AB,y指向的内存仍然是Bﻫy=x;//这句话就是把x的值 附值给 y,附的是地址! ﻫ这样 a,y,x 同时值向AB,b仍然指向B ﻫSystem。out。println(x+”,”+y);这里所以打印AB,AB System.out.println(a+","+b);这里所以打印AB ,Bﻫ引用参数的传递是把原来的地址传递给新的变量,原来引用的仍然在那里!ﻫ下面还是例子:ﻫ//在函数中传递基本数据类型, public classTest{ ﻫpublicstatic void change(inti,intj){ in
5、ttemp= i; i=j;ﻫj=temp;ﻫ} ﻫﻫpublic staticvoidmain(String[]args){ ﻫinta = 3; intb=4; change(a,b); System.out.println(”a="+a);System。out。println("b="+b); ﻫ}}结果为: a=3 b=4ﻫ原因就是参数中传递的是 基本类型a和 b 的拷贝,在函数中交换的也是那份拷贝的值而不是数据本身;publicclassTest{ ﻫpublicstaticvoidchange(int[]counts){counts[0] = 6; ﻫSystem
6、。out。println(counts[0]); } ﻫpublicstaticvoidmain(String[]args) { ﻫint[]count={1, 2, 3,4, 5 }; change(count);}ﻫ}ﻫ结果是:6 ﻫ在方法中传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。 这个要和下面的比较下:classA{ ﻫint i=0; } ﻫﻫpublic class Test{ publicstaticvoidadd(Aa) { ﻫa = new
7、A(); ﻫa。i++; }ﻫﻫpublicstaticvoid main(String args[]) {A a=newA();add(a);ﻫSystem。out.println(a.i);ﻫ} ﻫ} ﻫﻫ输出结果是0 ﻫ在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作. ﻫ而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。classA {ﻫint
此文档下载收益归作者所有