这两个程序几乎是相同的,但结果却是不同的 传递的只是句柄,m2 = m1;只是使m1,m2都成为t1的句柄,没有其他行为,而t1,t2本身的值没有变; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 传递对象作为参数时,只会传递该对象的一个引用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,m2t1,t2本身作为一个引用来讲并没有发生改变 请楼上的superscreen大侠能不能说得明白些谢谢!!!!!还有relive,也帮我分析一下谢谢!!!!!!! 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); 假设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;再看输出结果就不会觉得奇怪了吧! 楼上说的很对简单一点说,你的程序之所以不一样就在于你的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^ 不好意思 我刚才说的楼上是指 roger2008(痴人说梦) 基本变量的传递跟对象的传递没有有什么不同,都是按值传递,java的所有方法都是传递值的.关键是不同类型的变量值的类型不同.简单类型变量储存变量值本身,对象类型变量储存地址,这种差异会给人产生错觉,认为两者的传递方式不同.事实上,你虽然可以在方法内部改变外部的对象,但是你无法在方法内部改变外面任何变量的值,不管是简单类型的还是对象类型的,因为java的所有方法都是传递值的. 其实基本变量的传递跟对象的传递没有什么不同,都是值传递!需要区分的是基本变量的值是实际值,对象变量的值是对象的地址。假设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的值。我这样解释不知你是否满意? 高分请教一个串口问题,如何判断一个串口已经被其它程序占用。 eclipse开发servlet问题 一段很简单的额代码,但是就是显示有错误 Vector.get(int index)返回值的问题 validator-rules 的添加 高手请进~ 急! 1394接口编程 [急]JSP+Applet出错... 如何用线程判断时间过去5妙? 求助一个COOKIE的问题 如何实现,证书登录?? 在线等!~ 跪求~ 怎么把一个时间字符串转换成一个整数类型(int) 谁有maya4.5序列号?????
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本身作为一个引用来讲并没有发生改变
还有relive,也帮我分析一下谢谢!!!!!!!
m2=m1;使t1,m1,m2都成为new MyClass(1)的句柄(或是引用),所以第一次是1,1(t1,t2);第二次是1,2(m1,m2);
那么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;
再看输出结果就不会觉得奇怪了吧!
需要区分的是基本变量的值是实际值,对象变量的值是对象的地址。假设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的值。我这样解释不知你是否满意?