我认为SAsura说的不对如果以上程序中的operateMyClass改成如下
public void operateMyClass(MyClass m1,MyClass m2){
m2.x = m1.x;
}则结果为1 1

解决方案 »

  1.   

    我认为SAsura说的不对如果以上程序中的operateMyClass改成如下
    public void operateMyClass(MyClass m1,MyClass m2){
    m2.x = m1.x;
    }则结果为1 1java中所有的参数传递实质上都是值传递。
    上面的例子中当t1、t2传到operateMyClass时,系统会复制t1和t2的地址值给新的参数m1、m2,
    这样m2.x实质上访问访问t1.x。
      

  2.   

    tangshancheng(98007)说 “上面的例子中当t1、t2传到operateMyClass时,系统会复制t1和t2的地址值给新的参数m1、m2,这样m2.x实质上访问访问t1.x”,既然这样为什么在使用m2 = m1时没有把t2 改成 t1呢?而且我认为按照tangshancheng(98007)的说法实际上就是传的地址呀。
      

  3.   

    就象c中的指针一样 
    public void operateMyClass(MyClass m1,MyClass m2){
    m2x = m1x;
    }相当于c中 public void operateMyClass(MyClass *m1,MyClass *m2){
    m2 = m1;
    }当然不能改变实参了
      

  4.   

    找了找以前的帖子,好像明白了一点,可能还是因为主要不是科班出身的缘故,对一些问题理解的深度不够。自己总结一下:在面对对象编程中当一个对象建立后这个对象的变量的内容并不是这个对象,而是这个对象在内存中的地址,这个时候如果把这个对象传递给了一个方法,这个方法使用了这个对象,这是对这个对象的更改也就是对这段内存的更改,从外部来看就是把这个对象给改变了。这个时候如果对这个对象参数进行赋值,实际上改变的地址,而不是对象。也就是说在我上面的例子中执行m2 = m1;时只是把m2原来指向的地址改变为m1指向的地址了。
    说java中所有的参数传递实质上都是值传递有些不好理解。
    谢谢诸位了。
    如果有人能说得更清楚欢迎讨论。
      

  5.   

    你用c++中的指针来理解这个问题,就很好理解了。其实java中很多问题跟c++中很相似的。
    public void operateMyClass(MyClass m1,MyClass m2){
    m2.x = m1.x;
    }
    你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。
      

  6.   

    http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
      

  7.   

    在Java中没有指针,只有句柄。Java中对象的传递都是靠句柄来传递的,但是对于boolean, byte, short, int, long, float, double, char这些基本类型则是靠值传递的。这其实是pass by value 和pass by reference的问题。可以搜索一下查看相关文章。
      

  8.   

    我再总结一下:
    Java中肯定是通过值传递的,然而当一个引用类型被涉及的时候,这个被传递的值是个引用,但是这个和通过引用传递又不同了,如果Java是一个通过引用进行传递的语言,那么当一个引用类型被传递给一个方法的时候,它将被作为一个指向引用的引用来传递!
      

  9.   

    你用c++中的指针来理解这个问题,就很好理解了。其实java中很多问题跟c++中很相似的。
    public void operateMyClass(MyClass m1,MyClass m2){
    m2.x = m1.x;
    }
    你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。这个解释不对!
    这个地方肯定不是建立一个新的对象引用再销毁的!按道理肯定是传的原来对象的引用!
      

  10.   

    其实 tangshancheng(98007)说的就非常的明确的(不过不是很详细)。只要理解了C语言中指针的概念,这个问题不难理解。只是Java的语法与C中的不同,在Java中语法更简洁,但是,有些时候,语法简单,理解上去麻烦8)。