Во время подготовки к экзамену 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");
}
}
Вопрос : Это только неизменные объекты, которые ведут себя таким образом, и изменяемые объекты могут быть изменены путем передачи ссылок по значению? Правильно ли мое понимание или в этом поведении есть другие льготы?