这个问题在这里已经有答案了:
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中是一个对象,所以基本上是一个引用类型?)时,我们看到原始值发生了变化?
1条答案
按热度按时间7vux5j2d1#
两者都作为引用传递。方法中的局部变量(最初)指向与调用者(main)相同的对象。
下面是发生的事情。
字符串是不可变的。在方法中重新分配字符串时,将创建一个新对象,并更新本地引用以指向新对象。原始对象仍然存在,main中的引用仍然指向它。
我是第二个例子,数组的引用是以同样的方式复制的。本地引用指向与main中相同的数组。但是这次数组引用没有更新。相反,数组中的一个字符串引用被更新为指向一个新的字符串对象。