问题描述
publicclassTest{publicstaticvoidmain(String[]args){CountmyCount=newCount();inttimes=0;for(inti=0;i<100;i++)increment(myCount,times);System.out.println("countis"+myCount.count);System.out.println("timesis"+times);}publicstaticvoidincrement(Countc,inttimes){c.count++;times++;}}classCount{publicintcount;Count(intc){count=c;}Count(){count=1;}}
这段代码就是考这个的,为什么times的值不会改变?
解决方案
解决方案二:
myCount是类类型,传递过去的是一个引用而不是实体,当你执行递增的时候,就相当于修改了myCount类里面的count,所以这个会被自增而int是基本类型,传递的是一个值而已,而不是引用,所以无论你证明修改,time的值是不会变的
解决方案三:
基本类型是值传递,引用类型是引用传递值传递不改变原来的值,引用传递会改变原来的值
解决方案四:
其实都是传值,只不过一个传的是基本类型的值,一个传的是内存地址
解决方案五:
还是没大懂,能不能详细点
解决方案六:
这么说吧参数为引用类型,你传过去,对面拿到这个引用,可以任意修改而参数为基本数据类型,你传过去的是一个复制品,对面拿到的是复制品,再怎么修改,都对原来的参数没用,
解决方案七:
引用3楼longtian1213的回复:
其实都是传值,只不过一个传的是基本类型的值,一个传的是内存地址
赞同。都是传值,java中没有传引用这一说。传递的都是栈空间里的值。times是函数栈空间里的一个int类型的值,其值是一个整数,myCount也是函数栈里的一个引用类型(相当于int类型)的值,四个字节,其值是一个内存地址,代表myCount对象在堆空间里的内存地址。当函数调用时,都是传的值,times是把int值传给了函数,myCount同样也是把引用类型(相当于int类型)的值(内存地址)复制给了函数increment,函数increment把复制来的times增加了,把复制来的myCount所指向的堆空间里对象的一个属性增加了。然后函数退出了,弹栈了,原来存在栈里的times复制品失效了,myCount复制品也失效了,但是myCount复制品所指向的堆空间内容却真实地变化了。
解决方案八:
你可以这么理解,其实increment函数里面的c和times都是局部变量,活不久,但是c是一个引用,当调用一个函数过后,c指向的内存对象里面的count增加了1.然后循环调用该函数,活不久的times每次都被销毁,最终也就没增加,而引用c虽然也被销毁,但临死前将它指向的内存对象空间里面的count值改变了。
解决方案九:
改变的是局部变量的times值,变量名都可以被替换,其它的可以不一样,只是名字标志不同,但是功能相同.
解决方案十:
引用6楼arkwrightzhn的回复:
Quote: 引用3楼longtian1213的回复:
其实都是传值,只不过一个传的是基本类型的值,一个传的是内存地址赞同。都是传值,java中没有传引用这一说。传递的都是栈空间里的值。times是函数栈空间里的一个int类型的值,其值是一个整数,myCount也是函数栈里的一个引用类型(相当于int类型)的值,四个字节,其值是一个内存地址,代表myCount对象在堆空间里的内存地址。当函数调用时,都是传的值,times是把int值传给了函数,myCount同样也是把引用类型(相当于int类型)的值(内存地址)复制给了函数increment,函数increment把复制来的times增加了,把复制来的myCount所指向的堆空间里对象的一个属性增加了。然后函数退出了,弹栈了,原来存在栈里的times复制品失效了,myCount复制品也失效了,但是myCount复制品所指向的堆空间内容却真实地变化了。
很详细
解决方案十一:
基本类型传的是引用,inttimes=0;这样来理解吧,相当于电视机的遥控器times对应的是遥控器上面的频道,0是对应的电视机的频道比如cctv1,当你在times++的时候相当于把遥控器上的数字改变了,但是按下去还是cctv1吧,就这个意思,8个基本类型都这样不只是int哦楼主。