Эккель Брюс
Шрифт:
3 Примитивные типы в контейнерах храниться не могут, но благодаря механизму автоматической упаковки Java SE5 это ограничение почти несущественно. Далее в книге эта тема будет рассмотрена более подробно.
4 Примитивные типы, о которых речь пойдет далее, являются особым случаем.
5 Этот вопрос очень важен. Существуют люди, утверждающие: «Ясно, это указатель», но это предполагает соответствующую реализацию. Также ссылки Java по синтаксису более похожи на ссылки С++, чем на его указатели. В первом издании книги я решил ввести новый термин «дескриптор» (handle), потому что ссылки Java и С++ имеют несколько значительных различий. Я основывался на опыте С++ и не хотел сбивать с толку программистов на этом языке, так как большей частью именно они будут изучать Java. Во втором издании я решил прибегнуть к более традиционному термину «ссылка», предположив, что это поможет быстрее освоить новые особенности языка, в котором и без моих новых терминов много необычного. Однако есть люди, возражающие против термина «ссылка». Я прочитал в одной книге, что «совершенно неверно говорить, что Java поддерживает передачу объектов по ссылке», потому что идентификаторы объектов Java на самом деле (согласно автору) являются ссылками на объекты. И (он продолжает) все фактически передается по значению. Так что передача идет не по ссылке, а «ссылка на объект передается по значению». Можно поспорить с тем, насколько точны столь запутанные рассуждения, но я полагаю, что мое объяснение упрощает понимание концепции и ничему не вредит (блюстители нравственности могут сказать, что я лгу вам, но я всегда могу возразить, что речь идет всего лишь о подходящей абстракции).
Документация JDK и компилятор Java не включены в состав компакт-диска, поставляемого с этой книгой, потому что они регулярно обновляются. Загрузив их самостоятельно, вы получите самые свежие версии.
6 Статические методы, о которых вы узнаете немного позже, вызываются для класса, а не для объекта.
7 Часто используется компилятор IBM jikes, так как он работает намного быстрее компилятора javac от Sun. Также существуют проекты с открытыми исходными текстами, направленные на создание компиляторов, сред времени исполнения и библиотек Java.
Существует один фактор, который следует учитывать при работе с JVM на платформе MS Windows. Для вывода сообщений на консоль используется кодировка символов DOS (ср866). Так как для Windows по умолчанию принята кодировка Windows-1251, то очень часто бывает так, что русскоязычные сообщения не удается прочитать с экрана, они будут казаться иероглифами. Для исправления ситуации можно перенаправлять поток вывода следующим способом: java HelloDate > result, txt, тогда вывод программы окажется в файле result.txt (годится любое другое имя) и его можно будет прочитать. Этот подход применим к любой программе. Или же просто используйте одну из множества программ-«знакогенераторов» (например, keyrus), работая с экраном MS-DOS. Тогда вам не потребуются дополнительные действия по перенаправлению. Плюс станет возможной работа под отладчиком JDB. Третий вариант, более сложный, но обеспечивающий вам независимость от машины, заключается во встраивании перекодирования в свою программу посредством методов setOut и setErr (обходит байт-ориентированность потока PrintStream). Российские программисты давно (а отсчет идет с 1997 года) приспособились к этой ситуации. Одно из решений, позволяющее печатать на консоль в правильной кодировке, можно найти на сайте www.javaportal.ru (статья «Русские буквы и не только...»). (Нужно загрузить классCodepagePrintStream.java, скомпилировать его и описать в переменной окружения. Данный путь лучше отложить до ознакомления с соответствующей темой (глава 12).) — Примеч. ред.
Инструмент, который я создал на языке Python (подробнее на www.Python.org), распоряжается этой информацией для распределения файлов по папкам и создания файлов сборки. Вдобавок все файлы хранятся в системе CVS и автоматически вставляются в книгу с помощью макроса VBA (Visual Basic For Applications). Такой подход позволяет улучшить поддержку кода, особенно из-за использования CVS.
Находится по адресу java.sun.com/docs/codeconv/index.htmL Для экономии места в данной книге и на слайдах для семинаров я следовал не всем рекомендациям.
Джон Кирхем пишет: «Я начал программировать в 1960 году на FORTRAN II, используя компьютер IBM 1620. В то время, в 60-е и 70-е годы, FORTRAN использовал только заглавные буквы. Возможно, это произошло потому, что большинство старых устройств ввода были телетайпами, работавшими с 5-битовым кодом Бодо, который не поддерживал строчные буквы. Буква Е в экспоненциальной записи также была заглавной и не смешивалась с основанием натурального логарифма е, которое всегда записывается маленькой буквой. Символ Е просто выражал экспоненциальный характер, то есть обозначал основание системы счисления — обычно таким было 10. В те годы программисты широко использовали восьмеричную систему. И хотя я и не замечал такого, но если бы я увидел восьмеричное число в экспоненциальной форме, я бы предположил, что имеется в виду основание 8. Первый раз я встретился с использованием маленькой е в экспоненциальной записи в конце 70-х годов, и это было очень неудобно. Проблемы появились потом, когда строчные буквы по инерции перешли в FORTRAN. У нас существовали все нужные функции для действий с натуральными логарифмами, но все они записывались прописными буквами».
8 Перегрузку (overloading), то есть использование одного идентификатора для ссылки на разные элементы в одной области действия, следует отличать от замещения (overriding) — иной реализации метода в подклассе первоначально определившего метод класса. — Примеч. ред.
9 Некоторые демонстративно пишут this перед каждым методом и полем класса, объясняя это тем, что «так яснее и доходчивее». Не делайте этого. Мы используем языки высокого уровня по одной причине: они выполняют работу за нас. Если вы станете писать this там, где это не обязательно, то запутаете и разозлите любого человека, читающего ваш код, поскольку в большинстве программ ссылки this в таком контексте не используются. Последовательный и понятный стиль программирования экономит и время, и деньги.
10 Запомните эту формулу, и многих проблем удастся избежать. Она означает, что если перед тем, как объект станет ненужным, необходимо выполнить некоторое завершающее действие, то это действие вам придется выполнить собственноручно. В Java нет понятия деструктора или сходного с ним, поэтому придется написать обычный метод для проведения завершающих действий. Предположим, например, что в процессе создания объект рисуется на экране. Если вы вручную не сотрете изображение с экрана, его за вас никто удалять не станет. Поместите действия по стиранию изображения в метод finalize; тогда при удалении объекта сборщиком мусора оно будет выполнено и рисунок исчезнет, иначе изображение останется.
Может случиться так, что память объекта никогда не будет освобождена, потому что программа даже не приблизится к точке критического расхода ресурсов.
11 Джошуа Блош в своей книге (в разделе «Избегайте финализаторов») высказывается еще решительнее: «Финализаторы непредсказуемы, зачастую опасны и чаще всего не нужны». Effective Java, стр. 20 (издательство Addison-Wesley, 2001).
12 Этот термин предложил Билл Веннерс (www.artima.com) во время семинара, который мы проводили с ним вместе.