Java中的值传递和引用传递的区别.doc_第1页
Java中的值传递和引用传递的区别.doc_第2页
Java中的值传递和引用传递的区别.doc_第3页
Java中的值传递和引用传递的区别.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java中值传递和引用传递区别2011-07-09 18:48【转】java中值传递和引用传递区别 java中的八大基本数据类型:int long float double short byte char boolean看 似一样的方法,程序输出的结果却不太一样。changeObj()方法真正的把输入的参数改变了,而changePri()方 法对输入的参数没有任何的改变。 从这个例子知道Java对对象和基本的数据类型 的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等) 作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操 作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。 这种方式的参数传递 被称为值传递。而在Java中用对象的作为入口参数的传递则缺省为引 用传递,也就是说仅仅传递了对象的一个引用,这个引 用的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象 的直接操作。class MyDemo public static void operate(StringBuffer x, StringBuffer y) x.append(y);y = x;System.out.println(x + , + y);public static void main(String args) StringBuffer a = new StringBuffer(A);StringBuffer b = new StringBuffer(B);operate(a, b);System.out.println(a + , + b);结果:AB,ABAB,B解释:很明显你这里传递的是地址(引用)传递2个StringBuffer 对象! 注意啦: x 会指向 a 所指向的内存(可以理解为都指向A),y 会指向 b 所指向的内存,(可以理解为都指向B) x.append(y); /这句话把 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 class Test public static void change(int i, int j) int temp = i; i = j; j = temp; public static void main(String args) int a = 3; int b = 4; change(a, b); System.out.println(a= + a); System.out.println(b= + b); 结果为: a=3 b=4 原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身; public class Test public static void change(int counts) counts0 = 6; System.out.println(counts0); public static void main(String args) int count = 1, 2, 3, 4, 5 ; change(count); 结果是:6 在方法中 传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。 这个要和下面的比较下:class A int i = 0; public class Test public static void add(A a) a = new A(); a.i+; public static void main(String args) A a = new A(); add(a); System.out.println(a.i); 输出结果是0 在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作。 而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。class A int i = 0; public class Test public static void add(A a) /a = new A(); a.i+; public static void main(String args) A a = new A(); add(a); System.out.println(a.i); 输出结果是1 String 不改变,数组改变public class Example String str = new String(good); char ch = a, b, c ; public static void main(String args) Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str + and ); System.out.println(ex.ch); public void change(String str, char ch) str = test ok; ch0 = g; 程序3输出的是 good and gbc. String 比较特别,看过String 代码的都知道, String 是 final的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论