传递的只是句柄,m2 = m1;只是使m1,m2都成为t1的句柄,没有其他行为,而t1,t2本身的值没有变;

解决方案 »

  1.   

    传递对象作为参数时,只会传递该对象的一个引用
    m1,m2都是引用,是不同于t1,t2的变量,但指向的对象分别与t1,t2相同
    他们的作用域都是operateMyClass方法之内
    程序1中将m2=m1使得m2指向m1(也是t1)所指向的对象
    所以m2.x取到的值实际上就是t1.x(也是m1.x)的值
    程序2中t1,t2的引用并没有改变
    所以输出的结果会是1 2
    注意t.operateMyClass(t1,t2);中t1,t2与
    operateMyClass(MyClass m1,MyClass m2)中的m1,m2并不是同一个变量
    只是把t1,t2的引用分别传递给了两个新的变量(对象的引用而已)m1,m2
    t1,t2本身作为一个引用来讲并没有发生改变
      

  2.   

    请楼上的superscreen大侠能不能说得明白些谢谢!!!!!
    还有relive,也帮我分析一下谢谢!!!!!!!
      

  3.   

    t1,t2,m1,m2都是对象的句柄,不是对象本身,你可以理解为指向对象的地址或引用,所以在参数传递以后,t1,m1成为new MyClass(1)的句柄;t2,m2成为new MyClass(2)的句柄;
    m2=m1;使t1,m1,m2都成为new MyClass(1)的句柄(或是引用),所以第一次是1,1(t1,t2);第二次是1,2(m1,m2);
      

  4.   

    假设new MyClass(1)在内存中的地址为0x55555,new MyClass(2)在内存中的地址为0x66666,
    那么t1的值为0x55555,t2的值为0x66666,java的方法总是传值的,所以执行t.operateMyClass(t1,t2)时;后,t1和t2的值被赋予m1和m2,此时:
    t1=0x55555;
    t2=0x66666;
    m1=0x55555;
    m2=0x66666;
    在operateMyClass(MyClass m1,MyClass m2)方法内部,执行m2=m1,但t1和t2值不变,此时:
    t1=0x55555;
    t2=0x66666;
    m1=0x55555;
    m2=0x55555;
    再看输出结果就不会觉得奇怪了吧!
      

  5.   

    楼上说的很对简单一点说,你的程序之所以不一样就在于你的System.out.println(m1.x + " " + m2.x);的位置你的operateMyClass方法中的m2 = m1;的意思你好象没有明白,他和m2.x=m1.x是不一样的m2 = m1;的意思是对象m2也指向了对象m1的地址,说到这里就和楼上的意思是一样的了,这个时候m1和m2其实就是两个一样的对象了.如果System.out.println(m1.x + " " + m2.x);放在m2 = m1之后,那输出当然都是m1.x的值了,反之则不同了                     ^O^
      

  6.   

    不好意思    我刚才说的楼上是指 roger2008(痴人说梦)
      

  7.   

    基本变量的传递跟对象的传递没有有什么不同,都是按值传递,java的所有方法都是传递值的.关键是不同类型的变量值的类型不同.简单类型变量储存变量值本身,对象类型变量储存地址,这种差异会给人产生错觉,认为两者的传递方式不同.事实上,你虽然可以在方法内部改变外部的对象,但是你无法在方法内部改变外面任何变量的值,不管是简单类型的还是对象类型的,因为java的所有方法都是传递值的.
      

  8.   

    其实基本变量的传递跟对象的传递没有什么不同,都是值传递!
    需要区分的是基本变量的值是实际值,对象变量的值是对象的地址。假设new MyClass(1)在内存中的地址为0x55555,new MyClass(2)在内存中的地址为0x66666。
    那么变量t1的值就是0x55555,变量t2的值就是0x66666当你在调用operateMyClass(MyClass m1,MyClass m2)时,系统就在内存里新开辟了两个局部变量m1和m2,然后将t1和t2的值分别赋给它们,于是,m1的值就是0x55555,变量m2的值就是0x66666。注意,这里的m1和m2是方法operateMyClass()里的局部变量,t1和m1分别是两个不同的变量,它们占用内存的不同区域,t2和m2也是如此。这样,当方法operateMyClass()执行时,不论你怎样改变m1和m2的值,都不会影响t1和t2的值。我这样解释不知你是否满意?