我试图弄清楚如何在void ref方法中访问sb变量。可能吗?当我准备测试时,出现了这个问题。
public class X{
public void ref(String refStr, StringBuilder refSB){
refStr = refStr + refSB.toString();
refSB.append(refStr);
refStr = null;
refSB = null;
//how can I access main variable sb here? Not possible?
//sb.append(str);
}
public static void main(String[] args){
String s = "myString";
StringBuilder sb = new StringBuilder("-myStringBuilder-");
new X().ref(s, sb);
System.out.println("s="+s+" sb="+sb);
}
}
答案 0 :(得分:2)
您正在为参考值指定null
,这使它无处可寻。传递参数时,您将通过引用传递它(内存指针)。分配新值或null
会更改引用,但不会更改它指向的内存对象。
因此,您可以使用方法中的StringBuilder
,它会将更改保留在方法之外,但您不能为指针指定其他内容(因为指针本身是方法的本地)。 / p>
例如:
public static void ref (StringBuilder refSB) {
refSB.append("addedWithinRefMethod"); // This works, you're using the object passed by ref
refSB = null; // This will not work because you're changing the pointer, not the actual object
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
ref(sb);
System.out.println(sb.toString()); // Will print "addedWithinRefMethod".
}
要使代码执行您想要的操作,您需要再使用一个引用,例如使用数组:
public static void ref(StringBuilder[] refSB) {
refSB[0] = null; // This works, outside the method the value will still be null
}
public static void main(String[] args) {
StringBuilder[] sb = new StringBuilder[] { new StringBuilder() };
ref(sb);
System.out.println(sb[0]); // Will print "null"
}
但是,请记住,副作用(改变在其外部定义的对象的方法)通常被认为是不好的做法,并在可能的情况下避免。
答案 1 :(得分:1)
是的,可以在void ref()
方法中使用sb引用。您实际上是使用sb
将ref()
引用传递给new X().ref(s, sb);
并在
public void ref(String refStr, StringBuilder refSB){
refStr = refStr + refSB.toString();
refSB.append(refStr);
refStr = null;
//USe refSB variable here
refSB.append(str);
}
不要这样做refSB = null;.