题目如下:
加粗文字
标准答案选择B
我在想,这个里面的change方法,为什么无法修改str的值啊?
是否是因为局部变量无法修改全局变量呢?
问题是上面的
String str = new String("good");
这一句话,也没有static啊。我晕了,不是说带有static的才是全局变量么?
初学者,不太懂,问题比较浅显,请见谅。
题目如下:
加粗文字
标准答案选择B
我在想,这个里面的change方法,为什么无法修改str的值啊?
是否是因为局部变量无法修改全局变量呢?
问题是上面的
String str = new String("good");
这一句话,也没有static啊。我晕了,不是说带有static的才是全局变量么?
初学者,不太懂,问题比较浅显,请见谅。
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
这个问题和函数无关,主要是Java的参数传递。
new String("good")
没毛病,生成的是一个string。问题发生在调用change的时候,参数分别是
str
和ch[]
.Java中没有引用传递,只有值传递,但是(注意这个但是),一个对象和一个数组作为参数,将会得到对象和数组的引用的值的复制。
首先 ,
String str = new String("good");
这个时候我们创建了一个string对象,其内容是"good",但是这个对象不是str
,str
只是一个指向这个对象的引用。同理,我们创建一个数组
ch
,ch
也不是这个数组,是这个数组的引用。这就是为什么我们可以做到
str = "abc"
而不会报错(String对象是不可改变的),因为我们并没有修改对象,我们只是创建了一个新的"abc"的String,然后修改了这个引用,让其指向新的string对象。接下来我们来看传参。再次说明一下Java的传参是 值传递。
我们在调用之前,我们有一个
str
和一个ch
,分别是指向对象和数组的引用。接下来传参。JVM将我们的
str
和ch
复制了一份,我这里记作_str
和_ch
,由于是值的复制所以复制出来的
_str
和_ch
和原来的一样,也是一个引用。所以这就是关键的部分。然后再接下来,在函数内部,
_str
这个引用被重新指向了一个新的String对象(所以原来的str没有影响)。而下一步,通过_ch
(它和原来的ch
一样,都是一个指向那个数组的引用),我们直接将那个数组的0号元素修改了,这就导致了原来数组所在内存被修改了。所以到最后,表现出来的结果就是,在原来的函数中,对
str
和ch
所指向的值进行检查的时候,str
这个引用本身和他指向的对象都没变化,所以str
保持不变,而ch
指向的数组,被修改了(被复制的引用指向了真实地址)。所以选B。
(手头没有工具,不然可以画个图展示一下,这里有一个相关的说明,可以了解一下)
所以这个问题和static没有关系,是一个Java函数传参和变量的类型的思辨。