这是我的代码:
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
我想在调用str
方法之后更改getThis
。
我知道我应该通过引用传递str
,并且我知道这可以通过将str
声明为static
并从main
方法中声明来完成在像Main.str
这样的方法中调用它。但这是通过引用传递的正确方法和标准方式吗?
答案 0 :(得分:3)
Java不是通过引用传递的,它总是按值传递。并提供参考。
它将引用作为值传递给调用者。您可以通过从String
方法返回getThis()
值并将其分配到同一变量
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";
}
}
答案 1 :(得分:3)
正如其他人所说,Java总是按值传递,但有一点需要注意,当你传入对象(比如String)时,你会将一个Reference的值传递给堆上的一个对象。
在您的示例中,赋值在方法之外没有任何影响,因为字符串是不可变的,所以您无法做很多事情。如果你传入一个StringBuilder,那么你可以改变堆上对象的状态。
更一般地,您可以传入包含set方法的包装器对象,而不是传入Object x。 Java提供了一个AtomicReference,允许您执行此操作。
答案 2 :(得分:-1)
在java中,“对象的引用按值传递”。所以,任何 对您传递的非基本对象的引用将直接引用 使用和更改将反映在原始对象中。
另外,作为附注,字符串是不可变的,所以,你 如果你试图改变它将获得一个新的字符串(字符串不能更改),原始字符串将不会被更改。