Ссылки могут быть реализованы путем сохранения адреса. Обычно ссылки на Java будут реализованы в виде указателей, но это не требуется в спецификации. Они могут использовать дополнительный уровень косвенности, чтобы упростить сборку мусора. Но, в конце концов, это (почти всегда) сводится к указателям (в стиле C), участвующим в реализации ссылок (в стиле Java).
Вы не можете сделать арифметику указателей со ссылками. Наиболее важное различие между указателем в C и ссылкой в Java заключается в том, что вы не можете получить (и манипулировать) базовое значение ссылки в Java. Другими словами: вы не можете делать арифметику указателей.
В C вы можете добавить что-то к указателю (то есть адресу) или вычесть что-то, чтобы указать на то, что находится «рядом», или указать на места, которые находятся в любом месте.
В Java ссылка указывает на одну вещь и только эту вещь. Вы можете заставить переменную содержать другую ссылку, но вы не можете просто попросить ее указать «вещь после оригинальной вещи».
Ссылки строго напечатаны. Другое отличие состоит в том, что тип ссылки гораздо более строго контролируется в Java, чем тип указателя в C. В C вы можете иметь и приводить int*
его к a char*
и просто заново интерпретировать память в этом месте. Эта переинтерпретация не работает в Java: вы можете интерпретировать объект на другом конце ссылки как нечто, чем он уже является (то есть вы можете привести Object
ссылку на String
ссылку, только если объект, на который указывает объект, фактически является a String
).
Эти различия делают указатели C более мощными, но и более опасными. Обе эти возможности (арифметика указателей и повторная интерпретация указанных значений) добавляют гибкость C и являются источником некоторых возможностей языка. Но они также являются большими источниками проблем, потому что при неправильном использовании они могут легко нарушить предположения, что ваш код построен вокруг. И довольно легко использовать их неправильно.