Философия java читать online. Вопросы и задания для русскоязычной книги Thinking in Java (Философия Java) Брюса Эккеля



Впервые читатель может познакомиться с полной версией этого классического труда, который ранее на русском языке печатался в сокращении. Книга, выдержавшая в оригинале не одно переиздание, за глубокое и поистине философское изложение тонкостей языка Java считается одним из лучших пособий для программистов. Чтобы по-настоящему понять язык Java, необходимо рассматривать его не просто как набор неких команд и операторов, а понять его “философию”, подход к решению задач, в сравнении с таковыми в других языках программирования. На этих страницах автор рассказывает об основных проблемах написания кода: в чем их природа и какой подход использует Java в их разрешении. Поэтому обсуждаемые в каждой главе черты языка неразрывно связаны с тем, как они используются для решения определенных задач.

Четвертое издание

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

Изменения

Компакт-диск, который традиционно прилагался к книге, в этом издании отсутствует. Важная часть этого диска - мультимедийный семинар Thinking in С (созданный для MindView Чаком Алисоном) - теперь доступна в виде загружаемой Flash-презентации. Цель этого семинара - подготовка читателей, незнакомых с синтаксисом С, к пониманию материала книги. Хотя в двух главах книги приведено неплохое вводное описание синтаксиса, для неопытных читателей их может оказаться недостаточно. Семинар Thinking in С поможет таким читателям подняться на необходимый уровень.

Пришлось, например, полностью переписать главу «Параллельное выполнение» (некогда «Многопоточность»), так чтобы материал соответствовал основным нововведениям Java SK5, но при этом в нем были отражены основные концепции многопоточности. Без такого фундамента понять более сложные вопросы многозадачности очень трудно. Я провел много месяцев в потустороннем мире «многопоточности», и материал, приведенный в конце главы, не только закладывает фундамент, но и прокладывает дорогу в более сложные территории.

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

Мое изучение паттернов проектирования также не стояло на месте, поэтому в книге вы найдете описания новых паттернов.

Структура материала также претерпела серьезные изменения. В основном это объяснялось спецификой учебного процесса вместе с пониманием того, что мое представление о «главах» необходимо пересмотреть. Я был склонен бессознательно считать, что тема должна быть «достаточно большой» для выделения в отдельную главу. Но на семинарах (и особенно при описании паттернов проектирования) оказалось, что участники лучше всего воспринимают материал, если после описания одного паттерна мы немедленно выполняли упражнение, даже если теория излагалась недолго (также выяснилось, что такой темп изложения больше подходит мне как учителю). Итак, в этой версии я постарался разбить главы по темам, не обращая внимания на их объем. Думаю, книга от этого стала только лучше.

Я также осознал всю важность тестирования кода. Если каждый раз при сборке и запуске своей системы вы не выполняете встроенных тестов, то у вас нет возможности определить, насколько надежен ваш код. Специально для примеров данной книги была создана инфраструктура модульного тестирования, позволяющая показывать и проверять результаты работы каждой программы. (Инфраструктура написана на Python; вы найдете ее в загружаемом коде книги по адресу www.MindView.net.) Общие вопросы тестирования рассматриваются в приложении по адресу MindView.net/Books/ Betterjapa; на мой взгляд, это основополагающие навыки, которыми должен владеть каждый программист.

Вдобавок я просмотрел все примеры книги и для каждого из них задал себе вопрос: «Почему я написал это так?» Поэтому в большинстве случаев были добавлены некоторые улучшения и исправления, так чтобы в примерах прослеживалась общая тема и они демонстрировали то, что я считаю лучшими практическими приемами написания кода Java (по крайней мере, в материале вводного уровня). Некоторые из уже существовавших примеров были значительно переработаны. Те, которые потеряли свое значение, были удалены, их место заняли новые примеры.

Я получил от читателей очень много прекрасных отзывов о первых трех изданиях книги, и мне это было очень приятно. Однако всегда были и есть жалобы, и по какой-то причине постоянно существует недовольство по поводу того, что «книга очень велика». По-моему, это не очень строгая критика, если «очень много страниц» - ваше единственное замечание. (Оно напомнило мне замечание императора Австрии Моцарту о его композиции: «Очень много нот!» Заметьте, что я никоим образом не сравниваю себя с Моцартом.) Вдобавок, я могу предположить, что подобные замечания исходят от людей, не знакомых еще с «громадностью» самого языка Java и не видевших других книг, посвященных предмету обсуждения. Кроме того, в этом издании я попытался убрать из книги устаревшие части (или по крайней мере те, без которых можно обойтись). Так или иначе, я просмотрел весь материал, удалил все лишнее, включил изменения и улучши;! все, что только мог. Я легко расстался со старыми текстами, поскольку этот материал сохранился на сайте (www.MindView.net) в виде свободно доступных первых трех изданий, а также загружаемых приложений.

Для тех, кто все же не удовлетворен размером книги, я действительно приношу свои извинения. Верите вы или нет, но я очень старался уменьшить ее размер.


Чтобы изменить документ по умолчанию, отредактируйте файл "blank.fb2" вручную.

Предисловие 13

Java SE5 и SE6 14

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

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

Развитие абстракции 18

Объект имеет интерфейс 20

Объект предоставляет услуги 22

Скрытая реализация 23

Повторное использование реализации 24

Наследование 25

Взаимозаменяемые объекты и полиморфизм 29

Однокорневая иерархия 33

Контейнеры 33

Параметризованные типы 35

Создание, использование объектов и время их жизни 36

Обработка исключений: борьба с ошибками 38

Параллельное выполнение 38

Java и Интернет 39

Глава 2. Все является объектом 48

Все объекты должны создаваться явно 49

Объекты никогда не приходится удалять 53

Создание новых типов данных 54

Методы, аргументы и возвращаемые значения 56

Создание программы на Java 58

Ключевое слово static 60

Наша первая программа на Java 61

Комментарии и встроенная документация 64

Стиль оформления программ 70

Глава 3. Операторы 71

Простые команды печати 71

Операторы Java 72

Литералы 82

В Java отсутствует sizeof() 92

Резюме 100

Глава 4. Управляющие конструкции 101

Синтаксис foreach 105

break и continue 108

Нехорошая команда goto 109

Резюме 115

Глава 5. Инициализация и завершение 116

Конструктор гарантирует инициализацию 116

Перегрузка методов 118

Очистка: финализация и сборка мусора 130

Инициализация членов класса 137

Инициализация конструктором 140

Инициализация массивов 146

Резюме 151

Глава 6. Управление доступом 152

Пакет как библиотечный модуль 153

Спецификаторы доступа Java 159

Интерфейс и реализация 163

Доступ к классам 164

Резюме 167

Глава 7. Повторное использование классов 169

Синтаксис композиции 170

Синтаксис наследования 172

Делегирование 176

Сочетание композиции и наследования 178

Композиция в сравнении с наследованием 184

Восходящее преобразование типов 186

Ключевое слово final 188

Резюме 197

Глава 8. Полиморфизм 198

Снова о восходящем преобразовании. . . > 199

Особенности 201

Конструкторы и полиморфизм 208

Ковариантность возвращаемых типов 216

Разработка с наследованием 217

Резюме 220

Глава 9. Интерфейсы 221

Абстрактные классы и методы 221

Интерфейсы 224

Отделение интерфейса от реализации 227

Расширение интерфейса через наследование 233

Интерфейсы как средство адаптации 236

Вложенные интерфейсы 239

Интерфейсы и фабрики 242

Резюме 244

Глава 10. Внутренние классы 245

Создание внутренних классов 245

Связь с внешним классом 246

Конструкции.this и.new 248

Внутренние классы и восходящее преобразование 249

Безымянные внутренние классы 253

Внутренние классы: зачем? 261

Наследование от внутренних классов 272

Можно ли переопределить внутренний класс? 272

Локальные внутренние классы 274

Резюме 276

Глава 11. Коллекции объектов 277

Параметризованные и типизованные контейнеры 277

Основные концепции 280

Добавление групп элементов 281

Итераторы 288

Множество 294

Очередь 298

PriorityQueue 299

Collection и Iterator 301

Идиома «метод-адаптер» 306

Резюме 309

Глава 12. Обработка ошибок и исключения 310

Основные исключения 310

Перехват исключений 312

Создание собственных исключений 314

Спецификации исключений 319

Перехват произвольных исключений 320

Стандартные исключения Java 328

Завершение с помощью finally 330

Использование finally с return 334

Ограничения при использовании исключений 336

Конструкторы 339

Идентификация исключений 343

Альтернативные решения 344

Резюме 351

Глава 13. Информация о типах 352

Необходимость в динамическом определении типов (RTTI) 352

Регистрация фабрик 372

Рефлексия: динамическая информация о классе 376

Динамические посредники 380

Объекты с неопределенным состоянием 384

Интерфейсы и информация о типах 390

Резюме 394

Глава 14. Параметризация 397

Простая параметризация 398

Параметризованные интерфейсы 404

Параметризованные методы 407

Построение сложных моделей 419

Ограничения 437

Метасимволы 440

Резюме 452

Глава 15. Массивы 454

Особенности массивов 454

Массив как объект 456

Возврат массива 458

Многомерные массивы 460

Массивы и параметризация 463

Создание тестовых данных 465

Создание массивов с использованием генераторов 470

Вспомогательный инструментарий Arrays 474

Резюме 482

Глава 16. Система ввода/вывода Java 483

Класс File 484

Ввод и вывод 489

Добавление атрибутов и интерфейсов 491

Классы Reader и Writer 494

RandomAccessFile: сам по себе 497

Типичное использование потоков ввода/вывода 498

Средства чтения и записи файлов 505

Стандартный ввод/вывод 507

Новый ввод/вывод (nio) 510

Сжатие данных 531

Сериализация объектов 536

Предпочтения 553

Резюме 555

Глава 17. Параллельное выполнение 557

Класс Thread 559

Исполнители 561

Совместное использование ресурсов 578

Взаимодействие между потоками 598

Взаимная блокировка 602

Новые библиотечные компоненты 607

CountDownLatch 607

CyclicBarrier 609

PriorityBlockingQueue 614

Семафоры 619

Моделирование 624

Резюме 629

Алфавитный указатель 631

Введение в объекты

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

Бенджамин Ли Ворф (1897-1941)

Возникновением компьютерной революции мы обязаны машине. Поэтому наши языки программирования стараются быть ближе к этой машине.

Но в то же время компьютеры не столько механизмы, сколько средства уси¬ления мысли («велосипеды для ума», как любит говорить Стив Джобе), и еще одно средство самовыражения. В результате инструменты программирования все меньше склоняются к машинам и все больше тяготеют к нашим умам, также как и к другим формам выражения человеческих устремлений, как-то: литера¬тура, живопись, скульптура, анимация и кинематограф. Объектно-ориентиро- ванное программирование (ООП) - часть превращения компьютера в средство самовыражения.

Эта глава познакомит вас с основами ООП, включая рассмотрение основ¬ных методов разработки программ. Она, и книга вообще, подразумевает нали¬чие у вас опыта программирования на процедурном языке, не обязательно С. Если вам покажется, что перед прочтением этой книги вам не хватает познаний в программировании и синтаксисе С, воспользуйтесь мультимедийным семина¬ром Thinking in С, который можно загрузить с сайта

В марте прошлого года обратился в филиал крупной международной компании в Самаре (да. наглости и амбиций у меня с детства в избытке). Знал на тот момент html, css, java, javascript (основы), pascal, visualbasic6, запросы mysql, php, общее представление: c++. Джаву я не знал вообще. Предложили работу верстальщика, но я отказался. Только программистом! Тогда дали список:

Брюс Эккель Thinking in Java (русский перевод 2го издания или оригинал 4го - прочел и то и другое)
-Стив Макконел - совершенный код.
-Банда четырех - Дизайн паттернов. (это почти азбука ООП)
-иметь максимально четкое представление разницы j2se и j2ee.

в декабре возникла необходимость работы. устроился в мелкую самарскую web-студию. сразу было ясно, что это мошенники, но нужны были любые работы, которые я смог бы показать будущим работодателям. платить не платили(хоть все уши обещаниями проели), но код к стандартам оформления приводили, а главное научили куда смотреть и что искать при ошибках, какие мелочи легко упустить.

Помимо литературы выше прошел курс intuit (сейчас понимаю, что он смехотворен по своему объему, но в принципе основы там есть)

В конце февраля я повторно выслал резюме и получил приглашение пройти собеседование. Всего собеседований оказалось 6 и длились 1.5 месяца. Два из них прошли по видеосвязи с Москвой. Вся картина напоминала кино "Приходите завтра". Но в конце-концов я получил предложение о работе. Договор был составлен на неполную занятость, т.к. на тот момент диплома у меня не было. В прошлом месяце я диплом получил и договор перезаключили на полный рабочий.

Текущая должность Soft-Engeneer. Оклад более чем устраивает. Вчера в связи с переходом на полный рабочий подняли на 30%.

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

Ps: Диплом синий по ФИЗИКЕ. я полностью самоучка, так что все в ваших руках. только еще английский со школы Free у меня (7 часов в неделю был). хотя американец, который к нам приезжал во время своей кругосветки его плохо знает. я еле половину понял из-за его акцента. но это в моем отделе не так критично. вся документация на английском - выучишь даже если не знал)))))

Отдельное спасибо этому форуму. я учился фактически здесь - ежедневно учил все топики, что попадутся)