今天编写TCP/IP的实验代码发现了一个很有意思的事情,有关于Java参数传递的。
这个输出结果是什么呢?还是1,4,
问题不难,就是跟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++