【JAVA小白】问关于变量作用域的问题

题目如下:

加粗文字clipboard.png

clipboard.png

标准答案选择B
我在想,这个里面的change方法,为什么无法修改str的值啊?
是否是因为局部变量无法修改全局变量呢?
问题是上面的

String str = new String("good");

这一句话,也没有static啊。我晕了,不是说带有static的才是全局变量么?
初学者,不太懂,问题比较浅显,请见谅。

阅读 2.5k
3 个回答

这个问题和函数无关,主要是Java的参数传递。

new String("good")没毛病,生成的是一个string。
问题发生在调用change的时候,参数分别是strch[].
Java中没有引用传递,只有值传递,但是(注意这个但是),一个对象和一个数组作为参数,将会得到对象和数组的引用的值的复制。

这句话可能有点难理解,我们这么拆分。

首先 ,String str = new String("good"); 这个时候我们创建了一个string对象,其内容是"good",但是这个对象不是strstr只是一个指向这个对象的引用。
同理,我们创建一个数组chch也不是这个数组,是这个数组的引用。

这就是为什么我们可以做到str = "abc"而不会报错(String对象是不可改变的),因为我们并没有修改对象,我们只是创建了一个新的"abc"的String,然后修改了这个引用,让其指向新的string对象。

接下来我们来看传参。再次说明一下Java的传参是 值传递。

我们在调用之前,我们有一个str和一个ch,分别是指向对象和数组的引用。
接下来传参。JVM将我们的strch复制了一份,我这里记作_str_ch,由于是值的复制
所以复制出来的_str_ch和原来的一样,也是一个引用

所以这就是关键的部分。然后再接下来,在函数内部,_str这个引用被重新指向了一个新的String对象(所以原来的str没有影响)。而下一步,通过_ch(它和原来的ch一样,都是一个指向那个数组的引用),我们直接将那个数组的0号元素修改了,这就导致了原来数组所在内存被修改了。

所以到最后,表现出来的结果就是,在原来的函数中,对strch所指向的值进行检查的时候,str这个引用本身和他指向的对象都没变化,所以str保持不变,而ch指向的数组,被修改了(被复制的引用指向了真实地址)。

所以选B。
(手头没有工具,不然可以画个图展示一下,这里有一个相关的说明,可以了解一下)

所以这个问题和static没有关系,是一个Java函数传参和变量的类型的思辨。

这不是变量作用域的问题,而是关于方法传递参数为引用类型时的问题,str="test ok"是直接让形参指向一个新的对象但实参的ex.str并没有改变原来的指向,而ch[0]='g'是修改了ch这个char数组对象(数组也是一个对象)内部的属性,所以方法结束后ex.str没变而ex.ch变了。楼上说的更详细一些

新手上路,请多包涵

你把change方法里的str = "test ok";换成this.str = "test ok";感受一下?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题