求解传递基本类型参数和传递引用类型参数的区别

问题描述

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哦楼主。

时间: 2024-11-06 16:44:59

求解传递基本类型参数和传递引用类型参数的区别的相关文章

字符串-java中String究竟是传递的值,还是引用

问题描述 java中String究竟是传递的值,还是引用 很多人说,java中的String虽然是对象,但是具有值类型的特征.他是值传递,传递的值. 我认为这这种说法完全是错误的. String和普通对象毫无区别,和其他对象一样,传递的是引用,而不是值. 一段String的运用代码: String a = "123"; public void change(String a){ a = "234"; } 很多人会说,a的值没有变,是因为String是值传递,问题是,

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

c#-编写一个方法(完成值修改),传递参数中是传递实体类好还是类的成员好

问题描述 编写一个方法(完成值修改),传递参数中是传递实体类好还是类的成员好 如题,假如有个类Letter{int a,int b,int c....int z}(假设有26个成员吧),我如果想写一个方法来改变某几个成员的值的时候,方法的参数是定义fun(Letter letter)好,还是定义fun(int a,int b,int c,...)几个我需要修改的成员好,方法体的功能是改变原有的值. 解决方案 各有各的好处,参数多,传实体类方便,参数少,传参方便. 解决方案二: 传实体类,或者传成

代码-求解getPoint()和getLocation()的区别

问题描述 求解getPoint()和getLocation()的区别 public void mouseDragged(MouseEvent e) { JLabel source = (JLabel)e.getSource(); Point imgPoint = source.getLocation(); Point point = e.getPoint(); source.setLocation(imgPoint.x+point.x-pressPoint.ximgPoint.y+point.y

浅谈Java中的四种引用方式的区别_java

强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi

添加web引用和添加服务引用有什么区别?

原文:添加web引用和添加服务引用有什么区别? 添加web引用和添加服务引用有什么区别, Add Service References 和 Add Web References 有啥区别? 参考 http://social.microsoft.com/Forums/zh-CN/xmlwebserviceszhchs/thread/808d870b-49f1-47ac-b105-4beb580bcec6 (1)VS2005里提供的Add Web Reference(添加Web服务引用)的功能主要是

通过地址栏传递参数.通过url传递参数

看看我的方法可以吗?应该可以了吧.(通过地址栏传递参数)(通过url传递参数)<script language="Javascript">var goUrl="index.asp?schooltype=&area=";function getType(vl){var stno,arno,tmpurl;stno=goUrl.indexOf("schooltype=");arno=goUrl.indexOf("area=

java this 传递-Java中this传递的用法

问题描述 Java中this传递的用法 假设有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数,那代码怎么写啊 解决方案 没有继承关系的类,不能用构造函数传值.你可以让部件类的构造函数包含一个容器的参数,在其中初始化: class Part { pbulci Part(Container c) { ... } } class Container { public Container() { Part p = new Part(t

通过地址栏传递参数.通过url传递参数(原创 是我给一个网友解决问题时写的)

看看我的方法可以吗?应该可以了吧.(通过地址栏传递参数)(通过url传递参数)<script language="Javascript">var goUrl="index.asp?schooltype=&area=";function getType(vl){var stno,arno,tmpurl;stno=goUrl.indexOf("schooltype=");arno=goUrl.indexOf("area=