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

今天编写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++






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值