java值传递

来源:互联网 发布:wampserver mac下载 编辑:程序博客网 时间:2024/05/20 11:24

趁热打铁,紧接着上一篇说说java的值传递。

java中只有值传递(这个值为内存地址)。

  //例1
1  void method1(){
2  int x=0;
3  this.change(x);
4  System.out.println(x);
5  }

6  void int change(int i){
7  i=1;
8  }

int 为原始数据类型,会存放在栈内。(存放方式参阅上一篇堆栈)当执行到第三行的时候传递给方法的我认为是一个内存地址,然后到第六行,变量i也在栈内创建了引用,指向传过来的x的地址。现在i=x;然后改变了i的值i=1;(参阅上篇存储方式,)栈内寻找值1,发现没有,于是将值1存放进栈。x还是指向原来的值0,这样并不会改变x的值。

在来说说传对象。

  //例2
1 void method1(){
2 StringBuffer x=new StringBuffer("Hello");
3 this.change(x);
4 System.out.println(x);
5 }

6 void int change(StringBuffer i){
7 i.append(" world!");
8 }

直接由第三行讲起(至于堆栈存储数据,参阅前一篇,不在赘述)。然后调用第六行,变量i将在栈内创建引用指向传递过来的x的地址。然后i通过这个地址操纵了堆里面的值,这样x也是指向这个值的,所以x的值被改变了。

在看一个

//例3

    1 void method1() {
  2 StringBuffer x = new StringBuffer("Hello");
  3 change1(x);
  4 System.out.println(x);
  5 }
  6
  7 void method2() {
  8 StringBuffer x = new StringBuffer("Hello");
  9 change2(x);
  10 System.out.println(x);
  11 }
  12
  13 void change1(StringBuffer sb) {
  14 sb.append(" world!");
  15 }
  16
  17 void change2(StringBuffer sb) {
  18 sb = new StringBuffer("hi");
  19 sb.append(" world!");
  20 }
调用method1(),屏幕打印结果为:"Hello world!"
调用method2(),我们认为结果应该是"hi world",因为sb传进来的是引用,可是实际执行的结果是"Hello"!

当道16行的时候,sb在栈内创建了引用指向了传递过来的x的地址。然后18行new StringBuffer("hi");在堆内创建了一个新的对象,此时sb指向了此对象,这样sb与传递过来的x指向的地址就不一样了,sb然后修了值,但是这样并不会影响到x的值,所以输出的还是Hello