传值和传引用.docVIP

  • 1
  • 0
  • 约9.13千字
  • 约 22页
  • 2018-03-13 发布于河南
  • 举报
传值和传引用

???1所谓传值和传引用 ????? 传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指针。 下面举个简单的例子,说明什么是传值,什么是传引用。 //例1 void method1(){ int x=0; this.change(x); System.out.println(x); } void change(int i){ i=1; } ????? 很显然的,在mothod1中执行了change(x)后,x的值并不会因为change方法中将输入参数赋值为1而变成1,也就是说在执行change(x)后,x的值依然是0。这是因为x传递给change(int i)的是值。这就是最简单的传值。 同样的,进行一点简单的变化。 //例2 void method1(){ StringBuffer x=new StringBuffer(Hello); this.change(x); System.out.println(x); } void change(StringBuffer i){ i.append( world!); } ????? 看起来没什么变化,但是这次mothed1中执行了change (x)后,x的值不再是Hello了,而是变成了Hello world!。这是因为x传递给change(i)的是x的引用。这是最经典的传引用。 似乎有些奇怪了,两段程序没有特别的不同,可是为什么一个传的是值而另一个传的是引用呢?...... ?? 一个例子: //例3 void mothed1(){ int x=0; int y=1; switchValue(x,y); System.out.println(x=+x); System.out.println(y=+y); } void switchValue(int a,int b){ int c=a; a=b; b=c; } ????? 上面是一个交换a,b值的函数,看起来似乎蛮正确的,但是这个函数永远也不会完成你想要的工作。 ????? 还有一个例子: //例4 StringBuffer a=new StringBuffer(I am a ); StringBuffer b=a; a.append(after append); a=b; System.out.println(a=+a);//a的值已经改变 在编程过程中,经常会遇到这种情况,一个变量的值要被临时改变一下,等用完之后再恢复到开始的值。就好像上面的例子,a为了保持它的值,使用b=a做赋值,之后a被改变,再之后a把暂存在b里面的值取回来。这是我们一厢情愿的想法,而事实上,这段代码执行后,你会发现a的值已经改变了。 以上是两个最简单的例子,真正的程序开发过程中,比这要复杂的情况每天都会遇到。 ??????3类型和类 ????? Java 提出的思想,在Java里面任何东西都是类。但是Java里面同时还有简单数据类型int,byte,char,boolean,与这些数据类型相对应的类是Integer,Byte,Character,Boolean,这样做依然不会破坏Java关于任何东西都是类的提法。这里提到数据类型和类似乎和我们要说的传值和传引用的问题无关,但这是我们分辨传值和传引用的基础。 ??????4试图分辨传值还是传引用 ????? 为什么是试图分辨呢?很简单,传值和传引用的问题无处不在,但是似乎还没有人能正统的给出标准,怎样的就是值拷贝调用,怎样的就是引用调用。面对这个问题,我们更多的应该是来自平时积累对Java的理解。 ????? 回过头来,我们分析一下上面的几个例子: ????? 先看例1,即使你不明白为什么,但是你应该知道这样做肯定不会改变x的值。为了方便说明,我们给例子都加上行号。 //例1 1 void method1(){ 2?? int x=0; 3?? this.change(x); 4 } 5 6 void change(int i){ 7 i=7; 8} ????? 让我们从内存的存储方式看一下x和I之间到底是什么关系。 ????? 在执行到第2行的时候,变量x指向一个存放着int 0的内存地址。 ????? 变量x----[存放值0] ????? 执行第3行调用change(x)方法的时候,内存中是这样的情形:x把自己值在内存中复制一份,然后变量i指向这个被复制出来的0。 ????? 变量x----[存放值0] ??????????????????????? 进行了一次值复制 ????? 变量x----[存放值0] ????? 这时候再执行到第7行的时候

文档评论(0)

1亿VIP精品文档

相关文档