void ref方法中的java引用变量

时间:2013-05-27 12:13:50

标签: java

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

2 个答案:

答案 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引用。您实际上是使用sbref()引用传递给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;.