Для лучшего понимания работы с параметрами методов в Java необходимо рассмотреть несколько вопросов.
Как передаются аргументы в методы ~ по значению или по ссылке? Сточки зрения программы вопрос формулируется, например, следующим образом. Пусть есть переменная, и она в качестве аргумента передается в некоторый метод. Могут ли произойти какие-либо изменения с этой переменной после завершения работы метода?
int х=3;
process(x);
print(x);
Предположим, используемый метод объявлен следующим образом:
public void process(int x) {
x=5; }
Какое значение появится на консоли после выполнения примера? Чтобы ответить на этот вопрос, необходимо вспомнить, как переменные разных типов хранят свои значения в Java.
Напомним, что примитивные переменные являются истинными хранилищами своих значений и изменение значения одной переменной никогда не скажется на значении другой. Параметр метода process(), хоть и имеет такое же имя х, на самом деле является полноценным хранилищем целочисленной величины. А потому присвоение ему значения 5 не скажется на внешних переменных. То есть результатом примера будет 3 и аргументы примитивного типа передаются в методы по значению. Единственный способ изменить такую переменную в результате работы метода - возвращать нужные величины из метода и использовать их при присвоении:
public int clouble(int х) {return х+х; }
public void test() {Int x=3;
x=double(x); }
Перейдем к ссылочным типам.
public void process(Point p) {p.x=3; }
public void testO {Point p = new Polnt( 1,2);
process(p);
print(p.x); }
Ссылочная переменная хранит ссылку на объект, находящийся в памяти виртуальной машины. Поэтому аргумент метода process() будет иметь в качестве значения ту же самую ссылку и, стало быть, ссылаться на тот же самый объект. Изменения состояния объекта, осуществленные с подошью одной ссылки, всегда видны при обращении к этому объекту с подошью другой. Поэтому результатом примера будет значение 3. Объектные значения передаются в Java по ссылке.
Однако если изменять не состояние объекта, а саму ссылку, то результат будет другим:
public void process(Point р) {р = new Polnt(4,5); }
public void testO {Point p = new Point(1,2);
process(p);
print(p.x);}
В этом примере аргумент метода processO после присвоения начинает ссылаться на другой объект, нежели исходная переменная р, а значит, результатом примера станет значение 1. Можно сказать, что ссылочные величины передаются по значению, но значением является именно ссылка на объект.
Теперь можно уточнить, что означает возможность объявлять параметры методов и конструкторов как final. Поскольку изменения значений параметров (но не объектов, на которые они ссылаются) никак не сказываются на переменных вне метода, модификатор final говорит лишь о том, что значение этого параметра не будет меняться на протяжении работы метода. Разумеется, для аргумента final Point р выражение р.х=5 является допустимым (запрещается p=new Point(5, 5)).