void truifier (boolean bool) {
if (bool == false) {
bool = true;
}
}
void demo () {
boolean test = false;
truifier (test);
// test is still false
System.out.println (test);
}
Вы знаете, что можете вызывать функцию с буквальной константой - что здесь нужно изменить?
void demo2 () {
truifier (false);
}
Или с конечной локальной переменной
void demo2 () {
final boolean b = false;
truifier (b);
}
Или с атрибутами из класса:
class X {
private boolean secret = false;
void demo3 () {
truifier (secret);
}
}
Во всех этих вызовах truifier
получает локальную копию ссылки на рассматриваемый объект.
boolean b = false;
// b -> false
b является ссылкой на объект «ложь» - или в данном случае на примитивное значение.
boolean c = b;
// c -> false, not: c-> b -> false
c = true;
// c -> true
с изменен, но не б. c не псевдоним для b, а копия ссылки, и теперь копия ссылается на true
. Здесь есть только 2 реальных объекта (примитива): true и false.
При вызове метода копия ссылки создается и передается, и изменения в этой ссылке влияют только на это. Однако глубокого копирования нет. С классом, для которого вы меняете атрибут, этот атрибут будет изменен снаружи, но вы не можете заменить сам класс. Или Массивы: Вы можете изменить содержимое массива (ссылка на копию указывает на тот же массив), но не сам массив (например, размер). Хорошо - вы можете изменить его в методе, но внешняя ссылка независима и не изменилась.
k = [a, b, c, d]
l = k;
l [2] = z;
// l=k=[a, b, z, d]
l = [p, q, r]
// k = [a, b, z, d]