Ответ 1
По дизайну:
Некоторые люди скажут неправильно, что объекты передаются "по ссылке". В дизайн языка программирования, термин правильно пройти по ссылке, означает, что когда аргумент передается функция, вызываемая функция получает ссылка на исходное значение, а не копию его стоимости. Если функция изменяет его параметр, значение в код вызова будет изменен потому что аргумент и использование параметра тот же слот в памяти.... Java язык программирования не проходит объекты по ссылке; он передает объект ссылки по значению. Потому что два копии той же ссылки относятся к тот же фактический объект, внесенные изменения через одну ссылочную переменную видимый через другой. Там есть точно один режим передачи параметров - пройти по значению - и это помогает поддерживать все просто. - Джеймс Гослинг и др., Язык программирования Java, 4-е издание
Что касается более глубоких причин, то здесь я беру: это комбинация двух фактов:
- Последняя строка цитаты Гослинга: "... это помогает держать вещи простыми..."
- В отличие от С++, Java - это мусор, собранный со всеми объектами, выделенными в куче.
Я не могу помочь, если вам не нравится первый. Вам придется рассказать Джеймсу Гослингу и Биллу Джой и всем другим людям, которые разработали Java, что они сделали критическую ошибку. Удачи с этим. Java сегодня гораздо более широко используется, чем С++ сегодня несколькими способами. Рынок, каким бы несовершенным он ни был, не наказывает Java за то, что вы воспринимаете как надзор.
Передача по значению в С++ переносит нагрузку на обоих разработчиков (например, требования о назначении и конструкторах копирования) и писателя компилятора (например, дифференциация между переменными стека и кучи, все перестановки для передачи по значению и ссылке с константой и не константой).
Во-вторых, у дизайнера может быть больше технического объяснения. Я не эксперт в разработке и внедрении сборщиков мусора, но, возможно, это повлияло на их выбор по технической причине, о которой я не знаю.