0

我试图弄清楚如何在 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);
  }
}
4

2 回答 2

2

您将 a 分配null给参考值,这使它无处可去。当你传递一个参数时,你是通过引用(内存指针)传递它。分配新值或null更改引用,但不更改它指向的内存对象。

因此,您可以StringBuilder在方法内使用,它会将您的更改保留在方法之外,但您不能为指针分配其他内容(因为指针本身是方法的本地)。

例如:

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

要使代码执行您想要的操作,您需要再使用一个 derreference,例如使用数组:

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

但是,请记住,副作用(一种更改在其外部定义的对象的方法)通常被认为是不好的做法,应尽可能避免。

于 2013-05-27T12:23:19.663 回答
1

是的,可以在 void 方法中使用 sb 引用。ref()您实际上是在将sb引用传递给ref()using new X().ref(s, sb); And in

 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;.

于 2013-05-27T12:24:06.157 回答