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
中,JavaString
也是不可变的——您不能更改它们
但是,您可以使用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
中更改引用),或者只返回字符串。字符串值是不可变的——因此一旦获得值,就必须使用它。LiteralString
被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);
}