关于向方法传递值的混淆?

yb3bgrhw  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(341)

这个问题在这里已经有答案了

java是“按引用传递”还是“按值传递”(84个答案)
在java中数组是按值传递还是按引用传递[重复](7个答案)
昨天关门了。
我真的很困惑值是如何传递给函数的。我不知道当我们把它传递给一个函数时,什么类型的值会被改变。
示例1-将字符串(引用类型)传递给函数-

public static String word = new String("Hello World");

public static void main(String[] args)
{
    System.out.println("Before: " + word);
    UpdateValue(word);
    System.out.println("After: " + word);
}

public static void UpdateValue(String x)
{
    x = "Hi World";
}

输出:

Before: Hello World
After: Hello World

示例2-将字符串[]数组传递给函数-

public static String[] words = new String[] {"Hello", "Everyone"};

public static void main(String[] args)
{
    System.out.println("Before: " + Arrays.toString(words));
    UpdateValue(words);
    System.out.println("After: " + Arrays.toString(words));
}

public static void UpdateValue(String[] x)
{
    x[0] = "Hi";
}

输出:

Before: [Hello, Everyone]
After: [Hi, Everyone]

我的问题-
这一切是如何运作的? String 是一个引用类型,所以我之前的假设是,如果我们将值传递给函数,它将被更改。但那没有发生。值没有更改。
同时,当我传递数组(在java中是一个对象,所以基本上是一个引用类型?)时,我们看到原始值发生了变化?

7vux5j2d

7vux5j2d1#

两者都作为引用传递。方法中的局部变量(最初)指向与调用者(main)相同的对象。
下面是发生的事情。
字符串是不可变的。在方法中重新分配字符串时,将创建一个新对象,并更新本地引用以指向新对象。原始对象仍然存在,main中的引用仍然指向它。
我是第二个例子,数组的引用是以同样的方式复制的。本地引用指向与main中相同的数组。但是这次数组引用没有更新。相反,数组中的一个字符串引用被更新为指向一个新的字符串对象。

相关问题