我正在阅读这篇关于 Java的优秀文章,他在其中指出 reference semantics
Jon Skeet
我们假设存在一个名为 f 的过程,它采用形式参数 s。我们称该函数为实际参数 g。
调用代码:
f( g )
功能:
procedure f( s ) begin -- body of the procedure end;
Java 中的所有对象实例都是在堆上分配的,只能通过对象引用来访问。因此,如果我有以下内容:
StringBuffer g = new StringBuffer( "Hello" );
变量 g 不包含字符串“Hello”,它包含对包含字符串“Hello”的对象实例的引用(或指针)。
因此,如果我随后调用 f(g),f 可以自由修改其形式参数 s 以使其指向另一个 StringBuffer 或将其设置为 null。例如,函数 f 还可以通过附加“World”来修改 StringBuffer。虽然这会更改该 StringBuffer 的值,但该 StringBuffer 的值不是实际参数 g 的值。
我的理解可能是错误的。下面的程序确实改变了传递给方法的 Stringbuffer
public class MutabilityStringBuffer {
public static void main(String[] args){
StringBuffer sb = new StringBuffer("hello");
System.out.println("String before append: "+ sb.toString());
addString(sb);
System.out.println("Sting after append "+ sb.toString());
String s = "hello";
System.out.println("String before append: "+ s);
addString(s);
System.out.println("Sting after append "+ s);
}
public static void addString(StringBuffer word){
word.append(" world!");
}
public static void addString(String word){
word+=" world!";
}
}
当然,乔恩·斯基特不会错。但是我看到Stringbuffer
可以通过将其传递给方法来更改它,因为它stringbuffer
是可变的,这与 Skeet 发布的内容有点矛盾。请在这里澄清我的理解。
谢谢