【问题标题】:what is the correct and best way to pass argument by reference to a method?通过引用方法传递参数的正确和最佳方法是什么?
【发布时间】:2014-04-28 14:53:00
【问题描述】:

这是我的代码:

import java.util.LinkedList;

public class Main {


    public static void main(String[] args) {
        String str = new String("this is a text");
        System.out.println(str);
        getThis(str);
        System.out.println(str);

    }

    private static void getThis(String str) {
         str = "text changed"; 
    }

}

输出是:

this a text
this a text

我想在调用getThis 方法后更改str

我知道我应该通过引用传递str,并且我知道这可以通过将str 声明为static 并在main 方法之外然后在像这样@ 的方法中调用它来完成987654329@。但是通过引用传递是正确的方式和标准的方式吗?

【问题讨论】:

  • 声明一个变量static 意味着完全不同的东西。请再读一遍,理解这一点很重要。

标签: java parameter-passing pass-by-reference


【解决方案1】:

Java 不是按引用传递,它总是按值传递。并供参考。

它将引用作为值传递给调用者。您可以通过从 getThis() 方法返回 String 值并分配给同一个变量来做到这一点

public class Main {


    public static void main(String[] args) {
        String str = new String("this is a text");
        System.out.println(str);
        str = getThis();
        System.out.println(str);

    }

    private static String getThis() {
         return "text changed"; 
    }

}

【讨论】:

    【解决方案2】:

    在java中,“对对象的引用是按值传递的”。所以,任何 对您传递的非原始对象的引用将直接 使用和更改将反映在原始对象中。

    另外,作为一个旁注,字符串是不可变的,所以,你 如果你尝试改变它会得到一个新的字符串(字符串不能改变),原来的不会改变。

    【讨论】:

    • 字符串在这方面不是特殊的。它们是不可变的,但它们的行为与任何其他不可变类型一样。根本没有任何操作可以对字符串的内部状态进行(可见)更改。
    【解决方案3】:

    正如其他人所说,Java 总是按值传递,但需要注意的是,当您传入对象(如字符串)时,您将引用的值传递给堆上的对象。

    在您的示例中,赋值在方法之外没有任何影响,并且由于字符串是不可变的,您实际上无法做太多事情。如果你传入一个 StringBuilder,那么你可以改变堆上对象的状态。

    更一般地说,您可以传入一个包含 set 方法的包装对象,而不是传入一个 Object x。 Java 提供了一个 AtomicReference 允许您执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-27
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多