Простые типы
Ссылочные типы
Java: передача по ссылке?
Передача аргументов в Java происходит только по значению: аргумент копируется в область параметров и - точка! Однако, все так ясно только для аргументов примитивного типа, таких как int или float. Если же аргументами являются объектные ссылки, картина выглядит как классическая " передача по ссылке". Несмотря на то, что в метод передается копия ссылки, объект ссылки может изменить свое состояние в вызванном методе, причем это изменение сохранится и после возврата в вызывающий контекст. Естественно, передаваемая копия ссылки может меняться как угодно и это не повлияет на оригинал, находящийся в вызывающем контексте - оригинал по-прежнему будет указывать на тот же самый объект, что и до вызова. Но это не достижение Java и даже не отличительная черта, поскольку в С++ ссылка на объект, вообще является константной - ее нельзя переназначить, а следовательно, как ни передавай ее в метод: оригиналом или копией, в вызывающем контексте она утрачена не будет. Итак, повторим, ситуация выглядит как классическая передача по ссылке, хотя утверждается, что в Java такого способа не существует. Так есть или нет?! Этот вопрос решается как обычно: одни авторы - говорят, что - есть, другие, - нет, а третьи, - считают эту путаницу особым видом передачи аргументов в Java. Но кто же прав?! Java создавался группой разработчиков, двое (по меньшей мере) из которых, пишут книги. Это П. Ноутон (" Java 2", 2000г. ) и Дж. Гослинг (" Язык программирования Java", 2001г. ). П. Ноутон считает, что в Java имеет место передача объектов по ссылке, а Дж. Гослинг - категорически против. Как же Дж. Гослинг обосновывает свою точку зрения? В его книге на стр. 34 мы читаем следующее:
" Доступ к объектам осуществляется посредством ссылок - любая переменная, которая, как может показаться на первый взгляд, содержит сам объект, на самом деле хранит ссылку на этот объект. … В большинстве случаев вы вольны отступать от точной трактовки различий между действительными объектами и ссылками на них. Вполне допустимо вместо фразы «Передать в качестве аргумента метода ссылку на объект" употребить " Передать методу объект".
Логически, отсюда прямо следует, что мы именно " передаем объект по ссылке" и по форме и по сути. Тем не менее, в разделе, посвященном параметрам метода (стр. 77 ), мы читаем противоположное:
" Бытует насколько распространенное, настолько же неверное суждение о том, что объекты Java якобы передаются " по ссылке". В теории языков программирования достаточно употребительный термин передача по ссылке, строго говоря, означает следующее: когда аргумент передается в функцию, вызванная функция получает ссылку на исходное значение, но не копию этого значения".
Дж. Гослинг здесь описывает, что означает передача по ссылке, но отказывается замечать, что из его же описания прямо и логично следует, что в Java передача объектов осуществляется именно по ссылке. Но все же, " краем глаза" он видит несообразицу между посылкой и заключением и начинает излагать свое понимание термина " передача по ссылке". Суть его пространных рассуждений очень трудно уловить, но она сводится к следующему: в Java нет передачи по ссылке, потому что сама объектная ссылка передается по значению. Иначе говоря, из того, что в Java ссылка передается не по ссылке (?! ), следует, что в Java нет передачи по ссылке. (Это я оставлю без комментариев) Вероятно, автор(ы), цитируемой книги слышал и твердо верит, что в Java нет передачи по ссылке, но логически обосновать это - не в состоянии. Действительно, чисто логически проблема нерешаема, - здесь причиной коллизии является концептуальное расхождение между С++ и Java.
|