当方法参数是“对象”时的深刻理解

来源:互联网 发布:约德尔战斗学院淘宝 编辑:程序博客网 时间:2024/05/10 22:02

今天编写TCP/IP的实验代码发现了一个很有意思的事情,有关于Java参数传递的。

问题不难,就是跟c++容易混,所以一块讲了。


众所周知,当一个变量当做 参数 传递给一个方法时,通常的做法是不改变 方法外面 变量  的值 。

但是在c、c++里不同,举例说明:

void set(int &s);int main(){int c = 1;int &d = c;cout<<c<<endl;set(c);cout<<c<<endl;return 0;}void set (int &s){s = 4;}

结果是  :

1

4

因为 s 是 c 的引用,对 s 的修改等同于对 c 的修改 // 这个有疑问的话一定要好好补补。

当然这是简单类型,但是即使是复杂类型,在 c 、c++中也是如此。

java中呢

public class tttt {public static void main(String[]args){tttt t = new tttt();t.set(); }public void set(){dgSocket dg = new dgSocket();dg.num = 1;System.out.println(dg.num);setdg(dg);System.out.println(dg.num);}void setdg(dgSocket dg){dg.num = 4;}}class dgSocket{public int num;}



这个输出结果是什么呢?还是1,4,

也就是说传递过去的是引用!

这也就是java 和 c++ 最大的不同之一。

简单类型直接传值(简单类型没有引用),而复杂的类型全部都是引用,实际上我们根本无法获取对象,我们能获取的只是一个对象的引用而已。


说到这里,我今天遇到的问题有些搞笑了,我再 setdg 里面加了一句 dg = new dgSocket();

结果呢,我自以为的  1,4   并没有发生,好像没有执行过一样,结果是 1,1


那么结尾能得到什么启发呢?

你可以改变一个引用内部的值,但你永远不要指望通过一个方法,让传递过来的引用能够指向另一个对象!无论是Java还是C++