public class Main {
public static void main(String[] args) {
int x = 0;
int[] arr = {20};
String name = "Vitalii";
f(x, arr, Name);
System.out.println(x + " " + arr[0] + " " + Name);
}
private static void f(int x, int[] arr, String Name){
x = 20;
arr[0] =40;
name = "Max";
}
}
我的输出是“0 40 Vitalii”。我不明白为什么在方法f中,jvm在数组的第一个位置插入40,但对字符串不做任何操作。为什么它不会将它的值改为“Max”?我确信我会错过一些关于“传递参考”或“传递价值”或类似内容的重要概念。 谢谢你的帮助。
答案 0 :(得分:1)
由于局部变量值在此处打印。 Java遵循值传递。方法调用值后不会更改。
int x = 0;
int[] arr = {20};
String name = "Vitalii";
f(x, arr, name);//here you are calling f() method
System.out.println(x + " " + arr[0] + " " + name);
答案 1 :(得分:0)
如果要更改名称的值,请执行以下操作:
public class Main {
public static String name;
public static void main(String[] args) {
int x = 0;
int[] arr = {20};
name = "Vitalii";
//only classes should be capitalized
name = f(x, arr, name);
System.out.println(x + " " + arr[0] + " " + name);
}
private static String f(int x, int[] arr, String name){
x = 20;
arr[0] =40;
String newName = "Max";
return newName;
}
}
答案 2 :(得分:0)
Java按值传递所有内容,对于原语来说尤其如此。
所以在你的方法中:
private static void f(int x, int[] arr, String Name){
x = 20;
arr[0] =40;
name = "Max";
}
传入x时,x的值传入并由方法f的局部变量接收。因此,对它的任何更改都不会影响原始x
。
x = 20; //No changes to original x
Java中的字符串是不可变的。这意味着一旦创建,除非您创建新的String,否则无法更改它。
name = "Max"; //No changes to name.
当您传入数组时,复制所有数组值并传递给方法是低效的,因此传递了一个保存数组引用的值。在这种情况下,您可以直接影响数组中的元素,从而在执行arr[0] = 40
时产生更改。
arr[0] =40; //Changes to arr[0]
答案 3 :(得分:0)
因为Java支持传递值。因此,它不是传递变量引用,而是将实例变量的值复制到局部变量。 因此,对局部变量所做的任何更改都不会影响实际/实例变量