在准备 SCJP(或现在已知的 OCPJP)考试时,我被一些关于传递(参考)值和不变性的模拟问题所吸引。
我的理解是,当您将变量传递给方法时,您传递的是表示如何获取该变量的位的副本,而不是实际的对象本身。
您发送的副本指向同一个对象,因此您可以修改该对象(如果它是可变的),例如附加到 StringBuilder。但是,如果您对不可变对象执行某些操作,例如递增 Integer,则局部引用变量现在指向一个新对象,而原始引用变量仍然没有注意到这一点。
在这里考虑我的例子:
public class PassByValueExperiment
{
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello");
doSomething(sb);
System.out.println(sb);
Integer i = 0;
System.out.println("i before method call : " + i);
doSomethingAgain(i);
System.out.println("i after method call: " + i);
}
private static void doSomethingAgain(Integer localI)
{
// Integer is immutable, so by incrementing it, localI refers to newly created object, not the existing one
localI++;
}
private static void doSomething(StringBuilder localSb)
{
// localSb is a different reference variable, but points to the same object on heap
localSb.append(" world");
}
}
问题:是否只有不可变对象以这种方式运行,而可变对象可以通过值传递引用进行修改?我的理解是正确的还是这种行为有其他好处?