关于将值传递给方法的困惑? [复制]

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 中相同的数组。但是这次数组引用没有更新。而是将数组中的一个字符串引用更新为指向一个新的字符串对象。

【讨论】:

以上是关于关于将值传递给方法的困惑? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LinkedList<String> 内联将值传递给函数? [复制]

将值传递给React和Reactstrap中的进度条

Alamofire POST 方法不会将值传递给 url

Java:将值传递给方法的方式

Java:将值传递给方法的方式

使用 POST 方法将值传递给 Web 服务 [关闭]