关于将值传递给方法的困惑? [复制]
Posted
技术标签:
【中文标题】关于将值传递给方法的困惑? [复制]【英文标题】:Confusion regarding passing values to a method? [duplicate] 【发布时间】:2021-04-13 22:37:23 【问题描述】:我真的很困惑如何将值传递给函数。当我们将值传递给函数时,我无法弄清楚哪些类型的值会发生变化。
示例 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 - 将 String[] 数组传递给函数 -
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中是一个对象,所以基本上是一个引用
type?) 我们看到原来的值改变了?
【问题讨论】:
在 Java 中对象是按值传递的,但值是对对象的引用(数组也是对象),在示例 1 中,您正在分配一个 不同 的引用对象到参数,所以给定它是按值传递的,调用者不会更新。在示例 2 中,您正在更新数组 inside 的引用,因此调用者可以看到更改,因为它是它传入的 same 数组。顺便说一句:使用 @ 987654326@ 是不必要且浪费的,被认为是一种不好的做法。 【参考方案1】:两者都作为参考传递。方法中的局部变量(最初)指向与调用者(main)相同的对象。
这就是发生的事情。
字符串是不可变的。当您在方法中重新分配 String 时,会创建一个新对象,并更新本地引用以指向新对象。原始对象仍然存在,main 中的引用仍然指向它。
我是第二个例子,对数组的引用以相同的方式复制。本地引用指向与 main 中相同的数组。但是这次数组引用没有更新。而是将数组中的一个字符串引用更新为指向一个新的字符串对象。
【讨论】:
以上是关于关于将值传递给方法的困惑? [复制]的主要内容,如果未能解决你的问题,请参考以下文章