java 值_java的值传递笔记

1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到值传递。

2.于是,今晚就写起代码来验证一下,我去,居然纠结了一段时间。

因为直接写一个方法,带上基本类型和包装类型来一同做校验,思路是:

方法内,对形参进行加减操作,以便查看是否实参也会改变值(如果是值传递,基本类型是不会影响到实参的值的,引用类型的话,改变值一般会改变实参的值,我指的是成员值,当然有点特别,后续会提到);

再者,对形参做赋值,看是否实参也会改变值(基本类型,赋值不会影响到实参,引用类型赋值也一样不会影响到,不然不就引用传递了么)

于是代码就这么写了,包括了int,Integer,String,和自定义类

1 packagestudy;2

3 /**

4 * Created by dell on 2014/6/18.5 */

6 public classStudyTrans {7 public void methodWithTypes(intbase, Integer obj, ObjD od, String str){8 base +=100; //验证修改参数值是否改变实参值

9 Integer other = newInteger(base);10 obj+=120;//验证修改引用的实际内容

11 System.out.println(obj.toString());12 System.out.println(obj.intValue());//验证上一句是否能有效执行

13 obj = other; //验证赋值形参是否影响实参,影响则为引用传递

14 od.od +=100; //验证修改形参引用的内部值

15 od = new ObjD(80); //同obj =other

16 str += "ba";17 str = new String("nimei");18 }19 public static voidmain(String[] args){20 StudyTrans st = newStudyTrans();21 int t = 10;22 Integer o = new Integer(1024);23 ObjD od = new ObjD(10);24 String str = "hehe";25 st.methodWithTypes(t, o, od, str);26 System.out.println(t+" "+ o+" "+ od.od+ " "+str);27 }28 }29 classObjD {30 int od = 20;31 ObjD(intt){32 od=t;33 }34 }

结果呢?打印出来的数据:

1144

1144

10 1024 110 hehe

Disconnected from the target VM, address: '127.0.0.1:9751', transport: 'socket'

除了自定义类,其他参数都没有被方法搞到值有所变化,这本来也没错,可是,除了int,其他都是引用类型呀,不是应该可以改变其内容的成员值么?

经过一番谈论和思考,终于明白了,朋友说,源代码Integer里的私有成员int类型是final不可变的,因此一旦出现obj+=120;实际上相当于obj=new Integer(xxx);了。

是么?

在编译器上看一下地址值变化:

6710f3599b0773dddbc96d38b5c655cc.png

刚开始,还没执行方法内的赋值以及加减操作之前,实参地址分别是   @427, @428,@429 (o,od,str)

然后执行了看方法里的形参地址值:这里other是new的,所以地址是@430 (新的值),其他都说明了是值传递(地址值传递)

ed2915e9ce164669a7d48f5addf6534b.png

再看执行加减操作后的:

e05cafcbc48b2dbdcc7c5d2e4ab947df.png

看,obj立马就变了值,同时地址值也由@427变成了@475

再看看赋值后:obj赋值了other,地址值有变成了@430,str操作后也换了新的地址。

e33cf918a17984cdace243c7ab3c3157.png

以上,也就明确了,为什么包装类修改值不会影响到实参,因为修改值相当于new操作,相当于重新赋值地址值了,而本身又是值传递,不对地址值的那块地址内容做修改,也就不会有实参变化。

因此可以明确,java参数是值传递,因为对象传递的地址值传递特殊性往往让人觉得是引用传递。

不过我现在不会这么认为了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值