我可以使用此引用作为Java中的参数更改一个方法内的引用吗?
private static void changeString(String s) {
s = new String("new string");
}
public static void main(String[] args) {
String s = new String("old string");
changeString(s);
System.out.println(s); // expect "new string"
}
如何让“新字符串”的输出与s一起发生?只有参数方法changeString?我可以使用此引用作为Java中的参数更改一个方法内的引用吗?
谢谢。
在Java参数通过值传递时,对象参数传递给对象的引用,这意味着您可以更改参数的引用,但不会更改您传递引用的对象。您有两种可能性,返回新对象(首选)或将引用传递给可以接收新引用(集合,数组等)的容器)例如:
private static String changeStringAndReturn(String s) {
return new String("new string");
}
private static void changeStringInArray(String[] s) {
if (null != s && 0 < s.length) {
s[0] = new String("new string");
}
}
Java中的引用通过值,所以即使您修改函数内的引用,更改也不会反映回调用函数,因为您在函数内修改的内容只是原始副本参考不是原始参考本身。
但是你可以从你的changeString方法返回新的字符串,而不是试图修改那里(函数内部)的引用本身。
只有当你做的函数
private static void changeString(String[] s) {
s[0] = new String("new string");
}
字符串是不可变的,并且Java没有一个“指针到一个参考”作为第一类数据类型的概念。如果你不喜欢上面的内容,你可以创建一个包含单个字符串字段的类。
这在Java中不可行,因为Java中的所有内容都是按值传递的。在这种情况下,参数是对象引用,它是传递给方法的引用的值,而不是引用本身。
A:您不能在Java对象引用中传递值。
如果你真的需要,你可以创建一个包装like this,并使用它,你期望的方式:
private static void changeString(_<String> str) {
str.s("new string");
}
public static void main(String[] args) {
_<String> s = new _<String>("old string");
changeString(s);
System.out.println(s); // prints "new string"
}
你当然可以从你的changeString方法返回新的字符串,而不是试图改变它。
或者,您可以创建一个包装或包含一个字符串的对象,并将其传入。ChangeString方法将更改您的对象内部的字符串,并且主方法仍将持有对该对象的引用。
否则,你不能这样做。字符串是不可变的,并且java始终将对象作为指向特定对象的值传递。改变你指向的位置,并且不再引用同一个对象。
字符串在Java中是不可变的,参数是按值传递的,因此您不能更改它们(在C#中不等同于ref
)。您可以传入StringBuilder
并轻松更改其内容。
它的丑陋,但你可以将字符串更改为全局静态:
private static String s;
private static void changeString(String t) {
if(s.equals(t))
s = new String("new string");
}
public static void main(String[] args) {
s = new String("old string");
changeString(s);
System.out.println(s); // expect "new string"
}
在Java中,参数是按值传递! – Tarquila 2009-12-22 14:23:10
有趣的是代码是正确的,但“文档”是误导。我想知道他的代码是否也会发生同样的情况? – OscarRyz 2009-12-22 14:28:50
@ rsp--你能否改正你的文档,因为它是被接受的答案 – TStamper 2009-12-22 15:34:08