在静态方法中向字符串添加新值

时间:2015-09-21 17:43:06

标签: java

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”?我确信我会错过一些关于“传递参考”或“传递价值”或类似内容的重要概念。 谢谢你的帮助。

4 个答案:

答案 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;
    }
}

证明:https://ideone.com/tiT5YN

答案 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支持传递值。因此,它不是传递变量引用,而是将实例变量的值复制到局部变量。 因此,对局部变量所做的任何更改都不会影响实际/实例变量