【发布时间】:2020-01-20 10:58:47
【问题描述】:
我知道 java 是按值传递的,句号。但是,我仍然无法弄清楚这一点。
public static void changeTheName(String obj){
obj.toUpperCase();
}
这个方法不会影响到原来的字符串对象,还算可以理解。因为字符串是不可变的,并且字符串文字的变化意味着引用变量现在将引用新对象,而旧对象将留给垃圾收集器。但是当我传递一个字符串数组时,我可以更改字符串文字,这意味着我可以更改引用。为什么数组会发生这种情况,因为如果我们执行 obj[]= new String[]{} 它不会影响原始数组,并且原始数组仍然引用旧数组,这类似于直接更改字符串文字
public static void ChangeTheName(String obj[]){
for(int i=0;i<obj.length();i++) obj[i]=obj[i].toUpperCase;
}
编辑: 我一直在寻找的答案是 obj 和 obj[0] 的引用是唯一的,这就是为什么第二种方法能够更改我的数组的全部内容的原因。由于我来自 C 背景,我认为 obj 和 obj[0] 具有相同的引用,但在 java 中肯定不是这种情况。
【问题讨论】:
-
不确定第二个语句是如何做任何事情的,看到
toUpperCase应该返回一个新字符串,而不是更改现有字符串......也许我错过了什么? -
你还需要name你的方法,目前这不是有效的Java。
-
但是 OP is 是正确的,因为
obj的元素可以以对方法调用者可见的方式进行更改。obj[0] = "A New String"; would do it (assuming thatobj` 当然至少包含一个元素)。 -
@AndrewTobilko “句号”是针对观众的,所以他们不认为提问者不知道 java 纯粹是“按值传递”,这是我没有的错字t 写方法名。
标签: java arrays pass-by-reference pass-by-value