java中,数组传入函数中后,再使用new,是否改变数组值呢? 10
比如有一个int[]intArray={1,2,3},以及一个staticvoidchange(int[]arrays){arrays=newint[]{7,8,9};}...
比如有一个int[] intArray={1,2,3},以及一个 static void change(int[] arrays) { arrays=new int[]{ 7,8,9}; }。那么调用change(intArray)后,再输出intArray,为什么显示的还是1,2,3而不是7,8,9呢?相较之下,如果change内部仅仅改变数组的某个元素的值如intaArray[0]=7这就可以呢?
展开
2个回答
2016-09-10
展开全部
Java中有种数据类型叫:引用类型。
这个数组就是引用类型。实际上 要用new什么什么来创建的都是引用类型。
什么是引用类型呢?
举例来说:你new一个{1,2,3}数组,在计算机内存中实际上是这样操作的。
首先内存中会生成一个叫intArray的变量,并且在另一块内存中生成一个{1,2,3}数组。
然后把这个数组的内存地址值赋值给这个intArray的变量。所以说你传入函数的值只是那个数组的地址。
那这么做所出现的特性可以这么解释:
假如你在中国的南方海边(地址)建了一个叫广州(intArray)的城市, 后来你把它改名叫上海(arrays)并交给另一个人(change())打理,但他就觉得这个城市不配叫这个名字,于是他就在中国的东部临海(地址)新建了一座城市(new int[]),并把上海这个名字给了这个城市。
于是广州该多大就多大,就没在他手里改变过。他去了上海,所以广州是没变化的(所以显示的还是1,2,3)。
但如果他没有去东部新建上海这个城市,而是按你的要求把广州叫成上海来管理,使得广州的面积扩大了几十万平米(aArray[0]=7)。那么这个南方海边的城市就是实实在在的有了改变啦(显示成了7,2,3)。
就是说地址就是在那里,不管你换成什么名字,只要是在那个地址上的城市,它都是一个样的。
ps :
如果你直接打印这个数组变量的话,会打印出一串字符串,
像这样:“xx@xxx”
其中@符号前面的是这个实例的类型,@后面的是实例的内存地址的哈希值(你就把它当做是实例的地址吧,以后你学的更深的时候就会明白了)
这个数组就是引用类型。实际上 要用new什么什么来创建的都是引用类型。
什么是引用类型呢?
举例来说:你new一个{1,2,3}数组,在计算机内存中实际上是这样操作的。
首先内存中会生成一个叫intArray的变量,并且在另一块内存中生成一个{1,2,3}数组。
然后把这个数组的内存地址值赋值给这个intArray的变量。所以说你传入函数的值只是那个数组的地址。
那这么做所出现的特性可以这么解释:
假如你在中国的南方海边(地址)建了一个叫广州(intArray)的城市, 后来你把它改名叫上海(arrays)并交给另一个人(change())打理,但他就觉得这个城市不配叫这个名字,于是他就在中国的东部临海(地址)新建了一座城市(new int[]),并把上海这个名字给了这个城市。
于是广州该多大就多大,就没在他手里改变过。他去了上海,所以广州是没变化的(所以显示的还是1,2,3)。
但如果他没有去东部新建上海这个城市,而是按你的要求把广州叫成上海来管理,使得广州的面积扩大了几十万平米(aArray[0]=7)。那么这个南方海边的城市就是实实在在的有了改变啦(显示成了7,2,3)。
就是说地址就是在那里,不管你换成什么名字,只要是在那个地址上的城市,它都是一个样的。
ps :
如果你直接打印这个数组变量的话,会打印出一串字符串,
像这样:“xx@xxx”
其中@符号前面的是这个实例的类型,@后面的是实例的内存地址的哈希值(你就把它当做是实例的地址吧,以后你学的更深的时候就会明白了)
2016-09-10
展开全部
这新建实例后,是另外的对象了,所以,不会随参数返回改变后的值 的。。。。。。。。。
没实例化则是原来的对象,所以会返回 。。。。。。。。。。。。
没实例化则是原来的对象,所以会返回 。。。。。。。。。。。。
追问
那么在change函数中如何改变一维数组的值?
追答
不要重新new就会返回了 。。。。。。。。。。。。。。。。。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询