java的参数传递原理

java传参数的原理:

1. 对于基本类型 int, long, char, float, double等,是传值的。就是

int a = 0;

func(a);

这里无论func对参数a做了什么操作,在函数体外a都不受任何影响。

 

2. 对于对象类型,如StringBuffer, String,Integer等,在作为函数的参数的时候传过来的是一个对象实例的引用。说白了就是复制了一个对象的地址进来。比如:

String a = "ABC";

func(a);

 

void func(String s){

   s="BCD";

}

这里的话,当a作为参数传给func的时候,func里面的初始化类似会做一步:String s=a的操作,那么一个新的String对象引用s将会被创建,而s指向的是原来a指向的内容。那么s和a都会操作同一个堆里面的对象了。但是为什么s="BCD"以后,外面的a的值还是"ABC"呢?那是因为执行完 s="BCD"之后,s已经指向另外一个字符串常量了,当然不会对a造成影响。

 

其实出现这样的误会很大程度在于String类型的特殊性。其实一个string的对象被new出来以后,它的这块内存里面的内容是不会被改变的了(其实String类压根没有提供方法给你修改,你看到的replace和concat方法都没有改变这个String本身)。所以你把这块内存的引用放到函数里面去,其实都是没有办法修改的,只能新建立 一些string的内存引用。而其它类型,因为是能够操作堆里面的对象的内容的,所以使用引用对这些对象进行修改的时候,就能影响到函数外面的另外一个引用了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值