в электронном документе The Thinking
Решения предложенных упражнений содержатся в электронном документе The Thinking in Java Annotated Solution Guide (Думая на Java. Ответы на вопросы с комментариями), доступном за умеренную плату на сайте http://www.bruceeckel.com/.
[79] В Си, где в основном работа происходит с данными малых объемов, по умолчанию осуществляется "передача по значению". Для Си такая форма весьма эффективна, но при работе с объектами эффективность "передачи по значению" значительно снижается. Кроме того, разработка классов с поддержкой "передачи по значению" на Си - весьма непростая задача.
[80] Это слово вы не встретите в словаре английского (и русского) языка, но оно применяется в библиотеках Java, и поэтому включено сюда. Надеюсь что это не вызовет недоразумений.
[81] В качестве контраргумента этому утверждению вы можете создать простой "пример". Например такой:
public class Cloneit implements Cloneable {
public static void main (String[] args)
throws CloneNotSupportedException {
Cloneit a = new Cloneit();
Cloneit b = (Cloneit)a.clone();
}
}
Однако, он будет работать лишь за счет того, что main() является методом класса Cloneit и, таким образом, имеет право вызывать защищенный метод базового класса clone(). Если вы попробуете осуществить этот вызов из другого класса, это неминуемо приведет к ошибке компиляции.
[82] За исключением несчастного авокадо.
[83] Си++ предоставляет программисту возможность по своему желанию перегружать операторы. Поскольку зачастую это весьма сложный процесс (см. раздел 10 книги Думая на Си++, 2-я редакция, Prentice-Hall, 2000), разработчики Java сочли что это "нежелательный элемент", который не должен применяться в Java. Однако они таки не реализовали это свое решение, и это не так уж плохо, поскольку в результате по иронии судьбы перегрузка операторов в Java использовать гораздо проще чем в Си++. Более подробную информацию вы найдете на сайте Python (www.Python.org), на котором хранится сборщик мусора и простые примеры перегрузки операторов.
[84] Дуг Леа, который помогал при решении этой проблемы предложил мне такой выход, сказав что он просто создает функцию duplicate() для каждого класса.