我可以使用此引用作为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"); 
    } 
} 
+5

在Java中,参数是按值传递! – Tarquila 2009-12-22 14:23:10

+2

有趣的是代码是正确的,但“文档”是误导。我想知道他的代码是否也会发生同样的情况? – OscarRyz 2009-12-22 14:28:50

+0

@ rsp--你能否改正你的文档,因为它是被接受的答案 – TStamper 2009-12-22 15:34:08

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" 
} 

的Java不allow out parameters如C#,所以你将无法实现这一目标本身。

你当然可以从你的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" 
    }