关于参数传递的问题 我认为SAsura说的不对如果以上程序中的operateMyClass改成如下 public void operateMyClass(MyClass m1,MyClass m2){ m2.x = m1.x; }则结果为1 1 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我认为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。 tangshancheng(98007)说 “上面的例子中当t1、t2传到operateMyClass时,系统会复制t1和t2的地址值给新的参数m1、m2,这样m2.x实质上访问访问t1.x”,既然这样为什么在使用m2 = m1时没有把t2 改成 t1呢?而且我认为按照tangshancheng(98007)的说法实际上就是传的地址呀。 就象c中的指针一样 public void operateMyClass(MyClass m1,MyClass m2){ m2x = m1x; }相当于c中 public void operateMyClass(MyClass *m1,MyClass *m2){ m2 = m1; }当然不能改变实参了 找了找以前的帖子,好像明白了一点,可能还是因为主要不是科班出身的缘故,对一些问题理解的深度不够。自己总结一下:在面对对象编程中当一个对象建立后这个对象的变量的内容并不是这个对象,而是这个对象在内存中的地址,这个时候如果把这个对象传递给了一个方法,这个方法使用了这个对象,这是对这个对象的更改也就是对这段内存的更改,从外部来看就是把这个对象给改变了。这个时候如果对这个对象参数进行赋值,实际上改变的地址,而不是对象。也就是说在我上面的例子中执行m2 = m1;时只是把m2原来指向的地址改变为m1指向的地址了。说java中所有的参数传递实质上都是值传递有些不好理解。谢谢诸位了。如果有人能说得更清楚欢迎讨论。 你用c++中的指针来理解这个问题,就很好理解了。其实java中很多问题跟c++中很相似的。public void operateMyClass(MyClass m1,MyClass m2){ m2.x = m1.x; }你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。 http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中没有指针,只有句柄。Java中对象的传递都是靠句柄来传递的,但是对于boolean, byte, short, int, long, float, double, char这些基本类型则是靠值传递的。这其实是pass by value 和pass by reference的问题。可以搜索一下查看相关文章。 我再总结一下:Java中肯定是通过值传递的,然而当一个引用类型被涉及的时候,这个被传递的值是个引用,但是这个和通过引用传递又不同了,如果Java是一个通过引用进行传递的语言,那么当一个引用类型被传递给一个方法的时候,它将被作为一个指向引用的引用来传递! 你用c++中的指针来理解这个问题,就很好理解了。其实java中很多问题跟c++中很相似的。public void operateMyClass(MyClass m1,MyClass m2){ m2.x = m1.x; }你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。这个解释不对!这个地方肯定不是建立一个新的对象引用再销毁的!按道理肯定是传的原来对象的引用! 其实 tangshancheng(98007)说的就非常的明确的(不过不是很详细)。只要理解了C语言中指针的概念,这个问题不难理解。只是Java的语法与C中的不同,在Java中语法更简洁,但是,有些时候,语法简单,理解上去麻烦8)。 怎样实现在图片加页码的 老问题,poi导出大量数据,请大家来分析分析我的测试。 如果在Android 子线程中更新ui 新手问题:为什么【数组】下表要从0开始不从1开始? 字符串处理算法 菜鸟问题,大家快来帮我看看! 请问HASHSET和TREESET有什么区别? 请问以下问题如何用swing实现() 如何判断2004-02-34的正确性(在转换成日期时) java中发mail时CC和附件如何发?很急,多谢! 急 指点者一定有分!!! 请问哪个中文网站有下载java虚拟机!
public void operateMyClass(MyClass m1,MyClass m2){
m2.x = m1.x;
}则结果为1 1java中所有的参数传递实质上都是值传递。
上面的例子中当t1、t2传到operateMyClass时,系统会复制t1和t2的地址值给新的参数m1、m2,
这样m2.x实质上访问访问t1.x。
public void operateMyClass(MyClass m1,MyClass m2){
m2x = m1x;
}相当于c中 public void operateMyClass(MyClass *m1,MyClass *m2){
m2 = m1;
}当然不能改变实参了
说java中所有的参数传递实质上都是值传递有些不好理解。
谢谢诸位了。
如果有人能说得更清楚欢迎讨论。
public void operateMyClass(MyClass m1,MyClass m2){
m2.x = m1.x;
}
你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。
Java中肯定是通过值传递的,然而当一个引用类型被涉及的时候,这个被传递的值是个引用,但是这个和通过引用传递又不同了,如果Java是一个通过引用进行传递的语言,那么当一个引用类型被传递给一个方法的时候,它将被作为一个指向引用的引用来传递!
public void operateMyClass(MyClass m1,MyClass m2){
m2.x = m1.x;
}
你这样操作的时候,在对象的地址上是利用的传值调用。在函数里面相当如产生一个新的对象引用。指向你传过来的哪个对象,你对这个对象的操作都是有效的。但是当函数返回的时候,这个新的对象引用就会被销毁。这样就看到你所说的现象了。这个解释不对!
这个地方肯定不是建立一个新的对象引用再销毁的!按道理肯定是传的原来对象的引用!