Thinking in Java, 2nd edition, Revision 11

©2000 by Bruce Eckel

[ Предыдущая глава ] [ Оглавление ] [ Содержание ] [ Индекс ] [ Следующая глава ]

Введение

Как и любой другой язык, Java есть способ выражения каких-либо понятий. При правильном подходе определенный способ выражения будет гораздо проще и более гибок применительно к растущим и становящимся сложнее задачам, чем другой. Также нельзя рассматривать Java с точки зрения простого набора конструкций языка, поскольку некоторые из них не имеют смысла в отдельности. Вы сможете использовать разрозненные части языка вместе только в том случае если вы думаете о концепции в целом, а не о простом кодировании. И чтобы понять Java с данной позиции необходимо понять и основные задачи Java, и задачи программирования в целом. В данной книги мы остановимся на последних, рассмотрим необходимость их решения и пути решения с использованием Java. Так, набор конструкций, описываемый в каждой главе, применен к конкретной задаче, которая решена с помощью данного языка. Именно таким образом, я надеюсь в кратчайшее время подвести вас к той черте, когда концепции Java станут чуть ли не вторым вашим языком. Где возможно, я буду придерживаться мнения, что вы образно представляете модель, позволяющую глубже понять язык; и в случае решения какой-то слишком сложной задачи вы сможете сравнить ее с вашей моделью и найти ответ.

Предпосылки

Предполагается, что вы уже знакомы с базовыми концепциями программирования: вы знаете, что программа есть набор инструкций, что бывают процедуры/функции/макросы, что бывают управляющие конструкции такие как "if", а также конструкции построения цикла как "while" и т.п. Однако, вы могли почерпнуть эти знания из разных источников, таких как макро-языки или средства разработки типа Perl. Если ваш уровень программирования достаточен для свободного понимания основных идей программирования вы сможете без проблем изучить и эту книгу. Конечно, для программистов на С это будет несколько легче, а тем более для тех кто знает С++, но не стоит расстраиваться если у вас нет опыта программирования на этих языках (те кто хочет могут изучить синтакс языка С; информация содержится на CD-ROM, идущий с этой книгой). Я познакомлю вас с концепцией объектно - ориентированного подхода и механизмом событий Java, для вас это станет очевидным, а первый же пример познакомит вас с управляющими конструкциями. Несмотря на то, что сноски по тексту будут касаться особенностей языков С и С++, они не являются недопустимыми комментариями, а наоборот, призваны помочь оценить перспективы Java по сравнению с этими языками, от которых, в конечном счете, Java и произошла. Я постараюсь сделать эти сноски достаточно простыми и описать все, что может быть неизвестно тем, кто не программировал на С/С++.

Изучение Java

Примерно в то же самое время, когда вышла в свет моя первая книга Думай на С++ (Osborne/McGraw-Hill, 1989) я начал преподавательскую деятельность. Обучение языкам программирования стало моей профессией; я видел "клюющих носом", пустые лица и недоуменные выражения аудиторий по всему миру с того самого 1989 года. Когда же я начал давать частные уроки небольшой группе учеников, то обнаружилось, что даже те, кто развлекался или дремал во время занятий были в замешательстве по многим вопросам. Возглавляя отделение по С++ на Конференции Разработчиков Программного Обеспечения в течение нескольких лет я понял, что и я, и другие преподаватели стараются дать слишком много информации за слишком малый промежуток времени. Обычно, в зависимости от уровня подготовки и моего способа изложения материала, к концу семинара я терял часть аудитории. Возможно это о многом говорит, но я из тех людей, которые против традиционных способов проведения лекций (и как и для большинства людей, я уверен, что подобное сопротивление возникает от скуки), и мне хотелось бы обучение шло с максимальной скоростью. Поэтому в течении определенного времени я стал проводить короткие выступления, а само занятие заканчивалось экспериментами и повторениями (способ, который отлично работает также и при программировании на Java). В результате я создал курс, основанный на моем прошлом опыте, который я и хотел бы преподавать. Согласно тому курсу мы приступаем к решению задачи по частям, с простых шагов. На практических семинарах (идеальные с точки зрения обучения) множество задач следуют сразу за коротким объяснением. В настоящий момент я преподаю данный курс на публичных Java семинарах, ознакомиться с которыми вы можете на www.BruceEckel.com. (Кроме информации на Web-сайте, вводная часть семинара также есть на CD-ROM). Ответная реакция от слушателей, которую я получаю на каждом семинаре, помогает мне изменять или пересматривать материал до тех пор, пока я не решу, что он уже достаточно хорош для преподавания. Однако данная книга не является просто конспектом лекций семинара, в ней я постарался собрать и структурировать как можно больше информации, чтобы увлечь вас чтением каждой новой главы. Более того, книга создана для читателей изучающих новый язык программирования самостоятельно.

Цели

Так же как и предыдущая книга Думай на С++, эта книга структурирована вокруг процесса преподавания языка. В частности, моей мотивацией было создание чего-либо, что обеспечивало бы мне способ обучать языку на семинарах. Когда я думал о главах этой книги, я думал в терминах того, что позволило бы сделать лучший урок семинара. Моей целью было предоставить небольшой объем материала, который можно понять за приемлемый промежуток времени, выполняя примеры как и на лекциях. Поэтому цели  этой книги:
  1. Представить определенный объем материала так, чтобы вы могли легко усвоить его прежде чем перейдете к следующему.
  2. Использовать как можно короткие и простые примеры. Иногда это не позволяет разобрать "реальные" задачи, но я нашел, что начинающие обычно больше рады тому, что они могут понять каждую строку кода, вместо того чтобы поражаться обилием задач, которые данный кусок кода решает. Также существует строгое ограничение на объем кода, который может быть усвоен за одну лекцию. Возможно из-за этого кто-то будет критиковать меня в использовании "игрушечных" примеров, но я не отношусь к этому предвзято, так как я делаю что-то более полезное с педагогической точки зрения.
  3. Внимательно следовать описанию, чтобы вам потом не пришлось столкнуться с тем, что вы что-то пропустили. Это конечно не всегда возможно, и в таких случаях дается краткое введение.
  4. Давать вам только то, что я считаю нужным для понимания языка, а не все подряд что знаю я. Уверен, что существует определенная иерархия в важности информации, и некоторые факты, которые 95 процентам программистов просто не нужны, вводят большинство в заблуждение, приводя к мнению о сложности языка. Возьмем в качестве примера С, если вы запомнили таблицу последовательности выполнения операторов (я ее не помню), вы можете написать замечательный код. Но если необходимо постоянно думать об этом то это может запутать того кто читает или разрабатывает этот код. Поэтому лучше использовать скобки если что-то не понятно, чем помнить таблицу.
  5. Давать каждую главу достаточно сжато с тем, чтобы время лекции, и время между выполнением примеров, было меньше. Это не только позволяет аудитории быть более активной и увлеченной во время практических работ, но также дает читателю чувство завершенности.
  6. Дать вам фундамент, чтобы вы могли достаточно хорошо понять текущую главу и перейти к следующей, более сложной.

Online документация

Язык Java и библиотеки от Sun Microsystems (доступные для свободной загрузки) идут вместе с документацией в электронном виде, которые можно прочитать в любом Web-броузере и, практически, любая реализация языка Java третьих фирм имеет ту же или аналогичную документацию. Практически каждая книга, изданная про Java повторяет эту документацию. То есть, либо она уже у вас есть, либо вы можете ее свободно загрузить, поэтому, до тех пор пока в этом не будет крайней необходимости, эта книга не будет повторять документацию, так как вы гораздо быстрее найдете описание класса используя свой Web-броузер, чем листая книгу (и скорее всего on-line документация будет более современна). Книга будет давать дополнительное, к существующему, описание классов только в том случае, если это необходимо для понимания конкретного примера.

Главы

Книга была написана только с одной целью: научить языку Java. Ответная реакция слушателей семинара позволила мне понять те трудные места, которые требуют дополнительного объяснения. Я пришел к выводу, что когда я объяснял слишком много материала, то во время выступления я должен был рассказывать все аспекты, что, в свою очередь, легко приводило студентов в замешательство. В результате чего я решил представлять по возможности меньший объем материала.

Поэтому основная цель - в каждой главе дать определенную порцию материала, либо группу связанных понятий, не основываясь на дополнительных концепциях. Что означает, что вы сможете разобрать каждое понятие в контексте ваших текущих знаний прежде чем идти дальше. Далее дается краткое описание каждой главы книги, которые соответствуют лекциям и практическим работам на семинарах.

Глава 1: Введение в объекты

Данная глава является введением в объектно-ориентированное программирование, описывая, что есть объекты, интерфейсы, их реализация, абстракция и инкапсуляция, сообщения и функции, наследование и композиция, и вечно-важный полиморфизм. Вы также познакомитесь с тем, как создаются объекты, с конструкторами, где объекты живут, куда их помещают после создания и магическим сборщиком мусора, который очищает объекты, как только они стали не нужными. Также будут описаны обработка ошибок при исключениях, множественные нити процессов для создания отзывчивого пользовательского интерфейса, работа в сети и Интернет. Вы узнаете что особенного в Java, почему ее развитие столь успешно, об объектно-ориентированном анализе и разработке.

Глава 2: Все есть объект

Данная глава подведет вас к той точке когда вы напишите свою первую программу на Java, что требует первоначального описания некоторых понятий, включая ссылки на объект; создание объекта; описание простых типов и массивов;  размеры типов (scoping) и способность объектов быть уничтоженными сборщиком мусора; почему все в Java есть новый тип данных (классов) и как создать свой класс; функции, аргументы, возвращаемые значения; видимость переменных; использование компонентов из других библиотек; зарезервированное слово static; комментарии и встроенная документация.

Глава 3: Управление работой программы

Данная глава начинается с описания всех инструкций (operators) пришедших в Java из С и С++. Дополнительно вы столкнетесь с хитрыми ошибками, приведением типов, преобразованием и приоритетами. Далее следует описание основных операторов управления выполнением программы и логического ветвления, которые вы встретите практически в каждом языке программирования: выбор if-else; циклы for и while; завершение цикла по break и continue, также как и прерывание цикла и переход на ссылку (labeled break & labeled continue), которые заменяют отсутствующую в Java инструкцию goto; и выбор с использованием switch. Хотя большое количество примеров имеет много общего с С и С++, между ними есть различия. Все примеры этой главы являются полноценным Java кодом, так, чтобы вы могли представить как он выглядят.

Глава 4: Инициализация и очистка

Данная глава знакомит вас с конструкторами, гарантирующими правильную инициализацию. Понимание конструкторов ведет к пониманию концепции перегрузки функций (поскольку иногда необходимы несколько конструкторов). За этим последует объяснение процесса очистки, который не всегда так прост как может показаться. Обычно мы забываем про объект как только закончили его использовать, а сборщик мусора окончательно очищает память. Данная часть рассказывает о сборщике мусора и некоторых его особенностях. Глава заканчивается подробным описанием того, как объекты инициализируются: автоматическая инициализация членов, определенная инициализация, порядок инициализации, static инициализация и инициализация массивов.

Глава 5: Сокрытие реализации

Данная глава рассказывает о способе совместной упаковки кода, и почему некоторые части библиотек доступны, в то время как другие скрыты. Глава начинается с рассмотрения ключевых слов package и imoprt, которые выполняют упаковку на уровне файлов и позволяют создавать библиотеки классов. Затем опишем задание путей к каталогам и имена фалов. Оставшаяся часть главы рассматривает ключевые слова public, private, и protected, концепцию "дружественного" доступа, что и в каких случаях подразумевается под различными уровнями доступа.

Глава 6: Повторное использование классов

Понятие наследования является стандартным буквально во всех объектно-ориентированных языках. Если коротко, то это способность взять существующий класс и добавить к нему функциональности (так же как и изменить его, см. Главу 7). Наследование часто является способом повторного использования кода, оставив базовый класс "как есть" и лишь добавив код, выполняющий нужные вам действия. Однако наследование не единственный способ создания новых классов из существующих. Вы также можете внедрить объекты в ваш новый класс, используя композицию. Изучив данную главу, вы научитесь использовать оба этих метода и узнаете, как их применять.

Глава 7: Полиморфизм

При самостоятельном изучении можно потратить 9 месяцев на понимание что такое полиморфизм, краеугольный камень ООП. Но  с помощью простого маленького примера вы увидите, как создаются потомки с наследованием и как управлять объектами в потомке через его базовый класс. Полиморфизм в Java позволяет вам иметь дело со всеми объектами в потомке, это означает, что большая часть вашего кода не зависит от специфичной информации, что делает программу расширяемой, а создание и поддержку приложений  более легкой и дешевой.

Глава 8: Интерфейсы и внутренние классы

В Java имеется также третий способ для переопределения отношений - через интерфейсы, которые являются чисто абстрактными интерфейсами объекта. Interface это несколько больше чем просто абстрактный класс, взятый в качестве расширения, поскольку он позволяет вам выполнить что-то подобное "множественному наследованию" в стиле С++ создавая класс, который может ссылаться более чем на один базовый класс. Во первых, внутренние классы выглядят как простой механизм сокрытия кода: вы помещаете один класс внутрь другого. Но, как вы узнаете, внутренний класс делает несколько больше чем "просто знает как связываться с окружающими классами" и что код, написанный с использованием внутренних классов более изящный и понятный. Хотя для большинства это совершенно новая концепция и требуется некоторое время чтобы почувствовать себя уверенно.

Глава 9: Хранение ваших объектов

В данной главе будет приведена достаточно простая программа, которая имеет определенное количество объектов с известным временем жизни. В основном, программы всегда создают объекты в различное время, которое известное только в тот момент запуска программы. К тому, же во время работы программы, вам не нужно знать сколько объектов может потребоваться, все что вы хотите - создать столько объектов сколько, где и когда это необходимо. Данная глава подробно описывает библиотеку контейнеров, что появилась в Java 2. Для хранения объектов мы начнем описание с простых массивов и закончим более подходящими контейнерами такими как ArrayList и  HashMap.

Глава 10: Обработка ошибок и исключения

Основная философия Java заключается в том, что плохо написанный код не должен быть запущен. Насколько это возможно компилятор вылавливает ошибки, но иногда ошибки программиста или ошибки, возникающие при определенных условиях выполнения программы могут быть обнаружены и исправлены только во время выполнения программы. Данная глава рассматривает как ключевые слова try, catch, throw, thrown и finally работают в Java; когда вы должны вызвать исключения и что делать при перехвате исключения. Дополнительно рассмотрим стандартные исключения, создания собственных, что происходит с исключениями в конструкторе и как размещается обработчик исключений.

Глава 11: Система ввод/вывода в Java

Теоретически вы можете разбить каждую программу на три части: ввод, обработка и вывод. Это подразумевает что ввод/вывод важная часть приложения. Из данной главы вы узнаете о различных классах, которые реализуют чтение и запись в файлы, блоки памяти и консоль. Также будут показаны различия между старыми и новыми механизмами ввода/вывода в Java. Дополнительно рассмотрим процесс получения объектов, передачу в поток (streaming) так, чтобы их можно было записать на диск или передать через сеть, и их преобразование, что делается через клонирование объектов (object serialization). Рассмотрим библиотеки компрессии, используемые в архивных файлах Java (JAR).

Глава 12: Динамическая идентификация типов

Динамическая идентификация типов (RTTI) в Java позволяет однозначно найти объект когда существует только ссылка на базовый тип. Обычно можно намеренно игнорировать требуемый тип объекта, предоставляя возможность механизму Java динамической ссылки (полиморфизм) реализовать правильное поведение объекта. Но иногда бывает очень полезно знать точный тип объекта, для которого известна только ссылка на его базовый объект. Обычна подобная информация позволяет выполнять какие-либо специфичные операции эффективнее. Эта глава как раз и повествует о том, для чего RTTI предназначен, как его использовать и как от него освободиться когда он больше не нужен. Дополнительно объясняется механизм рефлексии (reflection).

Глава 13: Создание окон и апплетов

Java поставляется с библиотекой для создания графического интерфейса пользователя "Swing", что является набором классов для переносимых графических приложений. Программы, использующие данную библиотеку, могут быть как апплетами, так и обычными приложениями. Данная глава знакомит со Swing и созданием www-апплетов. Рассказывается о важной технологии "JavaBeans", которая являются основой для создания быстрых средств разработки программного обеспечения типа RAD (Rapid-Application Development).

Глава 14: Множественные процессы

Java имеет встроенные средства поддержки конкурентной многозадачности, называемые множественные процессы (threads) (которые иногда переводятся как потоки, что может привести к путанице со stream - потоками ввода/вывода. Прим. перев.), запускаемыми внутри одной программы. Если у вас не многопроцессорный компьютер, то это будет только имитацией многозадачности. Хотя это можно использовать где угодно, процессы наиболее применимы при попытке создания восприимчивого пользовательского интерфейса. Так, например, пользователь может нажать какую-либо кнопку или вводить данные пока программа что-то вычисляет. Данная глава посвящена синтаксису и семантике множественных процессов в Java.

Глава 15: Распределенные вычисления

Все особенности Java и библиотек выглядят действительно единым целым когда вы начинаете писать сетевые приложения. Данная глава объясняет сетевые коммуникации, Интернет и классы в Java, которые все это легко реализуют. Она описывает очень важную концепцию Servlet и JSP (для программ на стороне сервера) совместно с Java DataBase Connectivity (JDBC), и Remote Method Invocation (RMI). В конце будет дано краткое введение в новые технологии JINI, JavaSpaces, и Enterprise JavaBeans (EJBs).

Appendix A: Передача и возвращение объектов

Поскольку единственным способом общения с объектами являются ссылки, то концепция передачи объектов в функцию и получение их обратно имеет некоторые интересные последствия. Данное приложение объясняет что необходимо знать для управления объектами, когда передаем и принимаем их из функции, а также описывает класс String, используемый для разрешения некоторых проблемы.

Приложение B: Собственный интерфейс Java (JNI)

Полностью переносимая Java программа имеет серьезные недостатки: скорость выполнения и неспособность получить доступ к системно-зависимым службам. Когда особенности платформы, на которой запускается приложение, хорошо известны, можно значительно увеличить скорость выполнения некоторых операций, реализовав их как собственные методы (native mothod), которые представляют из себя фукнции, написанные на другом языке программирования (в настоящий момент поддерживаются только С и С++). В приложении даны основные понятия, чтобы вы были в состоянии написать простую программу работающую с не-Java кодом.

Приложение C: Java Programming Guidelines

Данное приложение содержит советы которые помогут при выполнении низкоуровневого создания программы и написании кода.

Приложение D: Рекомендуемая литература
Список книг, которые на мой (Брюса Экла) взгляд наиболее полезны.

Упражнения

Я нашел, что простые примеры исключительно полезны для окончательного понимания объясненного материала во время семинаров, поэтому в конце включено несколько заданий.  Большинство из разработанных примеров просты, чтобы их можно выполнить за короткий промежуток времени на семинаре, в то время как инструктор проверят все ли студенты в достаточной степени поняли материал. Некоторые примеры более сложны чтобы не вызвать скуку у наиболее продвинутых студентов.  В основном, цель большинства примеров решить их в короткое время, чтобы проверить и укрепить свои знания. Некоторые достаточно интересны, хотя и не вызывают всеобщего интереса. (Вероятнее что вы сами найдете их - либо они вас найдут). Выборочные решения могут быть найдены в электронном документации The Thinking in Java Annotated Solution Guide доступной на сайте www.BruceEckel.com за небольшую плату.

Мультимедийный CD ROM

Существует два мультимедийных диска связанных с этой книгой. Один связан непосредственно с книгой Thinking in C, что описывается после предисловия, и знакомит вас с соответствующим синтаксисом языка С, необходимым для понимания Java. Второй,  доступный мультимедиа диск, основан на данной книги. Он является отдельным продуктом и содержит полную версию недельного курса "Hands-On Java" (Практический курс Java), а также более 15 часов записанных лекций, одновременно с показом слайдов. Для семинаров, читаемых по данной книге, это лучшее подспорье. Также диск содержит все лекции (с важными замечаниями для привлечения внимания) с пятидневного учебного семинара в стиле "полного погружения".
Второй диск доступен только при заказе непосредственно на сайте www.BruceEckel.com.

Исходный код

Все исходные тексты примеров в данной книге являются зарегистрированными и свободно распространяемыми в виде единого пакета и доступны для загрузки с web-сайта www.BruceEckel.com. Чтобы быть уверенным, что вы получили самую последнюю версию пакета данный сайт является официальным распространителем исходного кода и электронной версии  книги. Вероятно вы найдете зеркала данного сайта (и адреса некоторых из них приведены на нашем сайте www.BruceEckel.com), но убедитесь, что зеркало содержит самую последнюю редакцию. Допустимо свободно использовать примеры книги для обучения или в других подобных целях. Основная идея авторства на приведенный исходный код заключается в том, чтобы убедиться, что исходный код процитирован верно, и не используется нелегального в других изданиях. (Однако код содержащий авторское право может быть свободно использован в других печатных изданиях). В каждом примере будет приведена следующая информация для зашиты авторских прав:
//:! :CopyRight.txt
Copyright ╘2000 Bruce Eckel 
Source code file from the 2nd edition of the book
"Thinking in Java." All rights reserved EXCEPT as
allowed by the following statements: 
You can freely use this file
for your own work (personal or commercial),
including modifications and distribution in
executable form only. Permission is granted to use
this file in classroom situations, including its
use in presentation materials, as long as the book
"Thinking in Java" is cited as the source. 
Except in classroom situations, you cannot copy
and distribute this code; instead, the sole
distribution point is http://www.BruceEckel.com 
(and official mirror sites) where it is
freely available. You cannot remove this
copyright and notice. You cannot distribute
modified versions of the source code in this
package. You cannot use this file in printed
media without the express permission of the
author. Bruce Eckel makes no representation about
the suitability of this software for any purpose.
It is provided "as is" without express or implied
warranty of any kind, including any implied
warranty of merchantability, fitness for a
particular purpose or non-infringement. The entire
risk as to the quality and performance of the
software is with you. Bruce Eckel and the
publisher shall not be liable for any damages
suffered by you or any third party as a result of
using or distributing software. In no event will
Bruce Eckel or the publisher be liable for any
lost revenue, profit, or data, or for direct,
indirect, special, consequential, incidental, or
punitive damages, however caused and regardless of
the theory of liability, arising out of the use of
or inability to use software, even if Bruce Eckel
and the publisher have been advised of the
possibility of such damages. Should the software
prove defective, you assume the cost of all
necessary servicing, repair, or correction. If you
think you've found an error, please submit the
correction using the form you will find at
www.BruceEckel.com. (Please use the same
form for non-code errors found in the book.)
///:~
Допустимо использовать код либо в ваших проектах, либо для преподавания (включая ваш материал) до тех пор, пока сохраняется информация об авторском праве.

Условные обозначения

По тексту книги, идентификаторы (функции, переменные и имена классов) выделены жирным шрифтом. Большинство ключевых слов также утолщенные, за исключением тех ключевых слов которые слишком часто встречаются и их постоянное выделение просто бы приелось, как например "class". Я также придерживаюсь определенного стиля для всех примеров данной книги. Этот стиль аналогичен тому, который Sun использует буквально для всех примеров программ на своем сайте (java.sun.com/docs/codeconv/index.html), и похоже поддерживается большинством средств разработки на Java. Если вы читали мою предыдущую работу, то также могли заметить, что стиль используемый Sun совпадает с моим, ну уж извините, я ничего не могу с эти поделать. Разговор о стиле форматирования хорош для целого часа бурных дискуссий, поэтому я просто решил, что просто не буду стараться диктовать корректный стиль с помощь  моих примеров; у меня есть свои соображения для использования того стиля который я и использую. Java не накладывает ограничений на стиль программирования, поэтому вы свободны в выборе любого удобного для вас стиля. Программы данной книги хранятся как файлы, которые потом добавляются текстовым редактором прямо из скомпилированных файлов, что гарантирует, что все приведенные примеры должны работать. Часть кода, которая должна вызывать ошибки при компилировании закомментирована знаком //! так что они могут быть легко найдены и автоматически протестированы. Найденные ошибки первоначально исправляются в распространяемом исходном коде, а затем  в следующих редакциях книги (которая также появляется на сайте www.BruceEckel.com).

Версии Java

В основном я доверяю Sun'овской реализации Java как источнику для выяснении правильности поведения кода. С течением времени Sun выпустил три версии Java: 1.0, 1.1, и 2 (которая называется версия 2 хотя релизы самой Sun продолжают использовать номера 1.2, 1.3, 1.4 и т.д.). Версия 2 похоже вышла в наиболее удобное время, в особенности тогда, когда необходим пользовательский интерфейс. Данная книга рассматривает и была протестирована именно с Java 2, хотя иногда я затрагиваю более ранние реализации Java 2, чтобы код мог быть скомпилирован и под Linux (используя тот Linux JDK, который был доступен в момент написания). Если необходимо ознакомиться с более ранними релизами языка, которые не описаны в данной редакции книги посмотрите первую редакцию, доступную для свободного скачивания на сайте www.BruceEckel.com, а также содержащуюся на CD-ROM, поставляемым с данной книгой. Небольшая оговорка, когда мне необходимо упомянуть более ранние версии языка я не использую под-номера версий, т.е. в данной книге я ссылаюсь только на Java 1.0, Java 1,1 и Java 2 с целью защититься от типографических ошибок возможных из-за других подверсий.

Семинары и сопровождение

Моя компания проводит 5-ти дневные, практические, для широкого круга и частные  учебные семинары основанные на материалах этой книги. Выборочный материал каждой главы представляет отдельный урок, за которым следует практические занятия, так, что каждый обучаемый получает персональное внимание. Аудио лекции и слайды для представления семинара также присутствуют на CD ROM, что позволяет представить семинар не выходя из дома и не тратя на переезд много денег. Для получения дополнительной информации посетите www.BruceEckel.com. Моя компания также оказывает консалтинговые, управленческие и тестовые услуги в сопровождении ваших проектов по всем циклам разработки, особенно если это первый Java проект вашей компании. 

Ошибки

Не важно какие ухищрения использует автор для поиска ошибок, некоторые все равно проскакивают и вылезают при повторном прочтении. В начале каждой главы в HTML формате (а также на CD-ROM или на сайте www.BruceEckel.com) находиться специальная форма для отправки сообщения об ошибках. Если вы что-то обнаружите и решите что это есть ошибка используйте данную форму для отправки сообщения, а также ваше мнение об ее исправлении. По необходимости, включайте файл с оригинальным исходным текстом и комментируйте любые предложенные изменения. Я буду вам благодарен за помощь.
(То же самое касается русского перевода книги. - Прим. перев.)

О дизайне обложки книги

Обложка книги Думай на Java вдохновлена American Arts & Crafts Movement, что началось ближе к концу прошлого века и достигла своего зенита между 1900 и 1920 годами. Все началось в Англии, как реакция на Индустриальную Революции, связанную как с производством машин, так и с высокохудожественным стилем орнамента в Викторианскую эру. Arts & Crafts подчеркивает скупость дизайна, природную форму как вид нового художественного течения, ручную работу, важность индивидуального мастерства, и в то же время ратует за использование современного оборудования. Это сильно перекликается с той ситуацией что мы имеет в настоящий момент: конец века, эволюция от начала компьютерной революции до чего-то более совершенного и значительного для каждого человека, и подчеркнутое отношение к созданию программного обеспечения, нежели простому штампованию кода. Я понимаю роль Java на этом пути как попытку отделить программистов от механизма операционных систем в сторону "программных мастеров" (software craftsman). Как автор(книги), так и дизайнер книги/обложки (которые кстати друзья с самого детства) нашли вдохновение в этом движения и оба приобрели мебель, лампы и прочие мелочи относящиеся к тому периоду. Другая тема в обложке подразумевает коробку для сбор и демонстрации насекомых, которую используют натуралисты. Насекомые - это объекты, которые помещаются в коробку - объекты. Коробка - объект в свою очередь помещается в другую коробку, что демонстрирует основные концепции накопления в объектно-ориентированном программировании.  Конечно, программист не может помочь (не говориться кому/чему - Прим. перев.), но сделает ассоциацию с "жучками" и тут "жучки" будут пойманы и, надо полагать, убиты в экземпляре коробки, и в конечно счете посажены внутрь небольшой коробочки, как если подразумевать способность Java находить, показывать и устранять ошибки (что по правде говоря один из наиболее важных атрибутов).

Благодарности

Во-первых, спасибо ассоциациям, которые работают со мной для подготовки семинаров, обеспечивают консалтинговую деятельности и развивают проекты по обучению: Andrea Provaglio, Dave Bartlett (который также значительно помог при написании Главы 15), Bill Venners, и Larry O▓Brien. Я благодарен вашему терпению в то время как я продолжал попытки создать лучшую модель совместного обучения для таких разных людей какими мы являемся. Спасибо Rolf Andr? Klaedtke (Швецария); Martin Vlcek, Martin Byer, Vlada & Pavel Lahoda, Martin the Bear, и Hanka (Прага); и Marco Cantu (Италия) за прием во время моего первого самостоятельно организованного семинаре в Европе. Спасибо Doyle Street Cohousing Community за поддержку в течении двух лет пока я писал первую редакцию книги (и просто за мою поддержку). Большое спасибо Kevin и Sonda Donovan за сдачу в субаренду отличного места в великолепном Crested Butte, Colorado пока я работал над первой редакцией книги. Также спасибо дружественным обитателям Crested Butte и Rocky Mountain Biological Laboratory, которые так доброжелательно ко мне относились. Спасибо Claudette Moore из Moore Literary Agency за ее громадное терпение и настойчивость в подаче того материала что я хотел. Моя первая книга была опубликована совместно с Jeff Pepper в качестве редактора в Osborne/McGraw-Hill. Jeff появился в нужный момент и в нужное время в Prentice-Hall, прочистил путь и сделал еще много полезных вещей, чтобы мой первый опыт публикации книги был достаточно приятным. Спасибо Jeff, это очень много для меня значило. Я особенно обязан Gen Kiyooka и его компании Digigami, котрые любезно предоставили мне Web сервер на первые несколько лет моего присутствия в сети. Это было бесценно с точки зрения обучения. Спасибо Cay Horstmann (соавтора Core Java, Prentice-Hall, 2000), D▓Arcy Smith (Symantec), и Paul Tyma (соавтора Java Primer Plus, The Waite Group, 1996), за разъяснение мне некоторых концепций языка. Спасибо всем тем, кто выступал в секции по Java на конференции Software Development Conference, а также студентам моих семинаров, которые задавали мне те нужные вопросы помогавшие мне сделать материал более доступным. Особая благодарность Larry и Tina O▓Brien, которые помогли записать семинары на CD ROM (более подробно на сайте www.BruceEckel.com). Множество людей отправляло мне замечания и я благодарен им всем, но особая благодарность (по первому изданию): Kevin Raulerson (нашедшиму тысячи ошибок), Bob Resendes (просто невероятно), John Pinto, Joe Dante, Joe Sharp (все три просто замечательны), David Combs (за многочисленные грамматические и стилистические исправления), Dr. Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, Neil Galarneau, David B. Malkovsky, Steve Wilkinson, и многие другие. Проф. Ir. Marc Meurrens проделал значительную работу в создании и публикации электронной версии книги, чтобы она стала доступной в Европе. Это был поток технически умных людей в моей жизни, которые стали друзьями, а также были влиятельными, и в то же время необычными в том, что они занимались йогой или практиковали другие формы духовного развития, которых я нашел очень вдохновленными и инструктивными. Kraig Brockschmidt, Gen Kiyooka, and Andrea Provaglio (которые помогли мне в понимании Java и программирование как таковом в Италии, а теперь и в Америке как коллеги по MindView team). Это не настолько необычно для меня, но понимание Delphi помогло мне в понимании Java, поскольку очень многие концепции и конструкции языка общие. Мои друзья, программисты на Delphi, помогли мне понять глубже отличную среду разработки. Это Marco Cantu (другой итальянец ≈ возможно увлечение латинским языком дает способности и к языкам программирования?), Neil Rubenking (который занимался йогой, вегетаринством и Дзен буддизмом пока он не открыл для себя мир компьютеров), и конечно Zack Urlocker, давнишний товарищ, с которым мы путешествуем по свету. Понимание и поддержка моего друга Richard Hale Shaw▓s была очень полезна (и Kim тоже). Richard и я провели много месяцев вместе, давая семинары друг другу и пытаясь найти наилучший способ обучения для слушателей. Также спасибо KoAnn Vikoren, Eric Faurot, Marco Pardi и всей команде MFI. Особая благодарность Tara Arrowood, который(ая)? (Прим.перев.) повторно вдохновил(а) меня на возможность создания конференции. Дизайн книги, обложки и все фотография были созданы моим другом - Daniel Will-Harris, известным автором и дизайнером (www.Will-Harris.com), который играл в слова в школе пока ожидал изобретения компьютера и настольных издательских систем, и жаловался на мое бормотание по поводу моих проблем с алгеброй. Однако, все опечатки в книге мои. Для написания книги, а также для создания версии для Adobe Acrobat в формате PDF, использовался Microsoft Word 97 for Windows. Спасибо корпорациям, которые создали компиляторы: Borland, группе Blackdown (для Linux), и конечно, Sun. Особая благодарность всем моим учителям и всем моим студентам (которые также мои учителя). Учителем, который достаточно забавно писал был Gabrielle Rico (автор Writing the Natural Way, Putnam, 1983). Я буду всегда ценить ужасную неделю в Esalen. В группу поддержки также входили, хотя только ими не ограничивается: Andrew Binstock, Steve Sinofsky, JD Hildebrandt, Tom Keffer, Brian McElhinney, Brinkley Barr, Bill Gates из Midnight Engineering Magazine, Larry Constantine и Lucy Lockwood, Greg Perry, Dan Putterman, Christi Westphal, Gene Wang, Dave Mayer, David Intersimone, Andrea Rosenfield, Claire Sawyers, другие итальянцы (Laura Fallai, Corrado, Ilsa и Cristina Giustozzi), Chris и Laura Strand, Almquists, Brad Jerbic, Marilyn Cvitanic, Mabrys, Haflingers, Pollocks, Peter Vinci, Robbins Families, Moelter Families (и McMillans), Michael Wilk, Dave Stoner, Laurie Adams, Cranstons, Larry Fogg, Mike и Karen Sequeira, Gary Entsminger и Allison Brody, Kevin Donovan и Sonda Eastlack, Chester и Shannon Andersen, Joe Lordi, Dave и Brenda Bartlett, David Lee, Rentschlers,  Sudeks, Dick, Patty и Lee Eckel, Lynn и Todd, а также их семья. И конечно, мои папа и мама.

Помощники в Интернет

Спасибо всем кто помог мне переписать примеры с использованием Swing библиотеки: Jon Shvarts, Thomas Kirsch, Rahim Adatia, Rajesh Jain, Ravi Manthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis и всем кто оказал поддержку. Это действительно помогло мне в проекте.

[ Предыдущая глава ] [ Оглавление ] [ Содержание ] [ Индекс ] [ Следующая глава ]
Последняя модификация: 04/24/2000