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