【问题标题】: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@ 是不必要且浪费的,被认为是一种不好的做法。

标签: java pass-by-reference pass-by-value


【解决方案1】:

两者都作为参考传递。方法中的局部变量(最初)指向与调用者(main)相同的对象。

这就是发生的事情。

字符串是不可变的。当您在方法中重新分配 String 时,会创建一个新对象,并更新本地引用以指向新对象。原始对象仍然存在,main 中的引用仍然指向它。

我是第二个例子,对数组的引用以相同的方式复制。本地引用指向与 main 中相同的数组。但是这次数组引用没有更新。而是将数组中的一个字符串引用更新为指向一个新的字符串对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多