我现在正在完成一项任务,并对此感到困惑。给出的代码很简单:
public class Variables{
public static void main(String[ ] args){
StringBuffer b = "ghi";
f(b);
System.out.println(b):
}
public static void f(StringBuffer p){
p.concat("jkl");
}
}
问题只是询问print语句的输出是什么。我的第一个想法只是“ghi”,但这是不正确的。如果方法f将b作为参数并将其设置为p,那么.concat()如何修改b?我已经阅读了StringBuffer文档,并且不明白为什么这不会以b等于“ghi”结束,而p是“ghijkl”。
基本上,在p上调用的.concat()方法如何修改b?
答案 0 :(得分:2)
首先,您需要正确创建一个StringBuffer。
StringBuffer foo = new StringBuffer("some string");
您将对象传递给函数。 Java将对象作为引用传递(引用本身当然是按值传递的)。请参阅:Is Java "pass-by-reference" or "pass-by-value"?
由于你有一个StringBuffer的引用而不是它的副本,你实际上修改的是同一个对象,就像你在main中一样。
答案 1 :(得分:1)
这是通过引用解析和按值解析之间的区别。
例如,当您创建一个采用基元的方法时,它会经历所谓的按值解析。 JVM几乎创建了一个值的副本,这就是你在方法中得到的。
int j = 0;
foo(k);
System.out.println(j); //Will still be 0.
public static void foo(int i) {
//i is not j (what you called the method with), it is a copy of it that is only valid within this method
i++;
}
现在,当您使用StringBuffer
之类的对象调用方法时,您正在按reference
进行解析。这意味着您没有解析StringBuffer的值(不解析带有“ghi”作为其内容的StringBuffer`),而是解析指向它的指针。使用此指针,您仍然可以在其他方法和代码体中对原始对象进行操作。