Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以更改字符串对象';s值传递给我的方法?_Java_String_Parameters_Pass By Reference_Immutability - Fatal编程技术网

Java 我可以更改字符串对象';s值传递给我的方法?

Java 我可以更改字符串对象';s值传递给我的方法?,java,string,parameters,pass-by-reference,immutability,Java,String,Parameters,Pass By Reference,Immutability,我发现了以下问题 我读了几乎所有的内容,但还不知道如果我想要foo(-)方法来更改我的字符串的值,我应该怎么做?(也许也有参考价值,对我来说并不重要) 我想在控制台上看到bla-bla。有可能吗?您不能更改foo中errorText的值,因为当前声明了该方法。即使将字符串errorText的引用传递到foo中,JavaString也是不可变的——您不能更改它们 但是,您可以使用StringBuffer(或StringBuilder)。这些类可以在foo方法中编辑 public class Tes

我发现了以下问题

我读了几乎所有的内容,但还不知道如果我想要
foo(-)
方法来更改我的
字符串
值,我应该怎么做?(也许也有参考价值,对我来说并不重要)


我想在控制台上看到
bla-bla
。有可能吗?

您不能更改
foo
errorText
的值,因为当前声明了该方法。即使将字符串
errorText
的引用传递到
foo
中,Java
String
也是不可变的——您不能更改它们

但是,您可以使用
StringBuffer
(或
StringBuilder
)。这些类可以在
foo
方法中编辑

public class Test {
    public static void foo(StringBuilder errorText){ 
        errorText.delete(0, errorText.length());
        errorText.append("bla bla");
    }

    public static void main(String[] args) { 
        StringBuilder error=new StringBuilder("initial");
        foo(error); 
        System.out.println(error);
    }
}

其他解决方案是使用包装器类(创建一个类来保存字符串引用,并在
foo
中更改引用),或者只返回字符串。

字符串值是不可变的——因此一旦获得值,就必须使用它。

Literal
String
被Java语言特别处理;您的代码大致相当于:

void foo(String errorText){ // at this point, errorText refers to the original string
    errorText=new String("bla bla"); // now it refers to a new string
}

int main(){ 
    String error=new String("initial"); // error is a reference to the original string
    foo(error); // pass a *copy* of the reference
    System.out.println(error);
}
换句话说,您只是将本地引用
errorText
指向另一个
String
对象,这不会影响方法之外的任何内容


但是,更一般地说,
String
s是不可变的;无法修改它们。

您可以重新分配字符串引用:

String foo(String err) {
  return "bla blah"
}

error = foo(error);

使用方法的返回值或创建包装类。

让它返回以下值:

String foo(String errorText){ 
    return "bla bla";
}

int main(){ 
    String error="initial"; 
    error = foo(error); 
    System.out.println(error);
}
将值包装到对象中:

class StringWrapper {
    private String string;
    public StringWrapper(String s) {
        this.string = s;
    }
    public String getString() {
        return this.string;
    }
    public void setString(String s) {
        this.string = s;
    }
}

void foo(StringWrapper errorText){ 
    errorText.setString("bla bla");
}

int main(){ 
    StringWrapper error=new StringWrapper("initial"); 
    foo(error); 
    System.out.println(error.getString());
}

是的,你可以通过反思来改变这一点,但这是违反规则的

void foo(String errorText) {
    try {
        final Class<String> type = String.class;
        final java.lang.reflect.Field valueField = type.getDeclaredField("value");
        valueField.setAccessible(true);
        valueField.set(errorText, "bla bla".toCharArray());
    } catch (Exception e) {
    }

}

public static void main(String[] args) {
    String error = new String("initial");
    foo(error);
    System.out.println(error);
}
void foo(字符串错误文本){
试一试{
最终类类型=String.Class;
final java.lang.reflect.Field valueField=type.getDeclaredField(“值”);
valueField.setAccessible(true);
valueField.set(errorText,“bla-bla.toCharArray());
}捕获(例外e){
}
}
公共静态void main(字符串[]args){
字符串错误=新字符串(“初始值”);
foo(错误);
系统输出打印项次(错误);
}
void foo(String errorText) {
    try {
        final Class<String> type = String.class;
        final java.lang.reflect.Field valueField = type.getDeclaredField("value");
        valueField.setAccessible(true);
        valueField.set(errorText, "bla bla".toCharArray());
    } catch (Exception e) {
    }

}

public static void main(String[] args) {
    String error = new String("initial");
    foo(error);
    System.out.println(error);
}