1
public static StringBuffer setString2(StringBuffer s)
{
s.append("::1st word");
return s;
}
static StringBuffer sbGlobal = new StringBuffer("before");
public static void main(String[] args)
{
System.out.println(setString2(sbGlobal));
}
2
public static void setString(StringBuffer s)
{
s.append("::1st word");
}
static StringBuffer sbGlobal = new StringBuffer("before");
public static void main(String[] args)
{
setString(sbGlobal);
System.out.println(sbGlobal);
}
有人可以向我解释,这里有什么不同吗?还有哪种方法更好,如果有任何差异,为什么?
答案 0 :(得分:2)
StringBuffer
是一个可变类。 setString2()
方法将StringBuffer
作为参数,修改它,并返回它。 setString()
方法将StringBuffer
作为参数,修改它,但不会返回它。
两个程序都做同样的事情并产生相同的结果。第二种解决方案更清晰:没有理由返回作为参数传递的内容。实际上,调用者已经引用了它作为参数传递的对象,因此返回此对象是无用的,并导致混淆:为什么该方法返回StringBuffer?这个StringBuffer和作为参数传递的StringBuffer是一个新的吗? StringBuffer是作为参数修改传递的,还是返回它的修改后的副本的方法?
第二种方法并不具备所有这些含糊之处。
旁注:您不应再使用StringBuffer
了。请改为StringBuilder
。
答案 1 :(得分:0)
public static StringBuffer setString2(StringBuffer s)
{
s.append("::1st word");
return s;
}
上面的方法返回StringBuffer
对象,该对象由append方法修改。所以在你做的时候
System.out.println(setString2(sbGlobal));
返回了StringBuffer
对象,该对象附加了一些String
并且正在打印。
在第二种情况下,没有返回类型及其void
。
public static void setString(StringBuffer s)
{
s.append("::1st word");
}
所以声明
System.out.println(setString2(sbGlobal)); //compile error because of void
致电时
setString(sbGlobal);
修改StringBuffer
对象,现在打印sbGlobal
对象
System.out.println(sbGlobal);