- •Аннотация
 - •Лекция 1. Что такое Java? История создания.
 - •1. Что такое Java?
 - •2. История создания Java
 - •2.1. Сложности внутри Sun Microsystems
 - •2.2. Проект Green
 - •2.3. Компания FirstPerson
 - •2.4. World Wide Web
 - •2.5. Возрождение Oak
 - •2.6. Java выходит в свет
 - •3. История развития Java
 - •3.1. Браузеры
 - •3.2. Сетевые компьютеры
 - •3.3. Платформа Java
 - •4. Заключение
 - •5. Контрольные вопросы
 - •Аннотация
 - •1. Основы объектно-ориентированного программирования
 - •1.1. Методология процедурно-ориентированного программирования
 - •1.2. Методология объектно-ориентированного программирования
 - •1.3. Объекты
 - •1.3.1. Состояние.
 - •1.3.2. Поведение
 - •1.3.3. Уникальность
 - •1.4. Классы
 - •1.4.1. Инкапсуляция
 - •1.4.2. Полиморфизм
 - •1.5. Типы отношений между классами
 - •1.5.1. Агрегация
 - •1.5.2. Ассоциация
 - •1.5.3. Наследование
 - •1.5.4. Метаклассы
 - •1.6. Достоинства ООП
 - •1.7. Недостатки ООП
 - •1.8. Заключение
 - •1.9. Контрольные вопросы
 - •Аннотация
 - •Лекция 3. Лексика языка
 - •1. Лексика языка
 - •1.1. Кодировка
 - •1.2. Анализ программы
 - •1.2.1. Пробелы
 - •1.2.2. Комментарии
 - •1.2.3. Лексемы
 - •1.3. Виды лексем
 - •1.3.1. Идентификаторы
 - •1.3.2. Ключевые слова
 - •1.3.3. Литералы
 - •1.3.3.1. Целочисленные литералы
 - •1.3.3.2. Дробные литералы
 - •1.3.3.3. Логические литералы
 - •1.3.3.4. Символьные литералы
 - •1.3.3.5. Строковые литералы
 - •1.3.3.6. Null литерал
 - •1.3.3.7. Разделители
 - •1.3.3.8. Операторы
 - •1.3.3.9. Заключение
 - •1.4. Дополнение: Работа с операторами
 - •1.4.1. Операторы присваивания и сравнения
 - •1.4.2. Арифметические операции
 - •1.4.3. Логические операторы
 - •1.4.4. Битовые операции
 - •1.5. Заключение
 - •1.6. Контрольные вопросы
 - •Аннотация
 - •Лекция 4. Типы данных
 - •1. Введение
 - •2. Переменные
 - •3. Примитивные и ссылочные типы данных
 - •3.1. Примитивные типы
 - •3.2. Целочисленные типы
 - •4. Дробные типы
 - •5. Булевский тип
 - •6. Ссылочные типы
 - •6.1. Объекты и правила работы с ними
 - •6.2. Класс Object
 - •6.3. Класс String
 - •6.4. Класс Class
 - •7. Заключение
 - •8. Заключение
 - •9. Контрольные вопросы
 - •Аннотация
 - •Лекция 5. Имена. Пакеты
 - •1. Введение
 - •2. Имена
 - •2.1. Простые и составные имена. Элементы.
 - •2.2. Имена и идентификаторы
 - •2.3. Область видимости (введение)
 - •3. Пакеты
 - •3.1. Элементы пакета
 - •3.2. Платформенная поддержка пакетов
 - •3.3. Модуль компиляции
 - •3.3.1. Объявление пакета
 - •3.3.2. Импорт-выражения
 - •3.3.3. Объявление верхнего уровня
 - •3.4. Уникальность имен пакетов
 - •4. Область видимости имен
 - •4.1. "Затеняющее" объявление (Shadowing)
 - •4.2. "Заслоняющее" объявление (Obscuring)
 - •5. Соглашения по именованию
 - •6. Заключение
 - •7. Контрольные вопросы
 - •Аннотация
 - •Лекция 6. Объявление классов
 - •1. Введение
 - •2. Модификаторы доступа
 - •2.1. Предназначение модификаторов доступа
 - •2.2. Разграничение доступа в Java
 - •3. Объявление классов
 - •3.1. Заголовок класса
 - •3.2. Тело класса
 - •3.3. Объявление полей
 - •3.4. Объявление методов
 - •3.5. Объявление конструкторов
 - •3.6. Инициализаторы
 - •4. Дополнительные свойства классов
 - •4.1. Метод main
 - •4.2. Параметры методов
 - •4.3. Перегруженные методы
 - •5. Заключение
 - •6. Контрольные вопросы
 - •Аннотация
 - •Лекция 7. Преобразование типов
 - •1. Введение
 - •2. Виды приведений
 - •2.1. Тождественное преобразование
 - •2.2. Преобразование примитивных типов (расширение и сужение)
 - •2.3. Преобразование ссылочных типов (расширение и сужение)
 - •2.4. Преобразование к строке
 - •2.5. Запрещенные преобразования
 - •3. Применение приведений
 - •3.1. Присвоение значений
 - •3.2. Вызов метода
 - •3.3. Явное приведение
 - •3.4. Оператор конкатенации строк
 - •3.5. Числовое расширение
 - •3.5.1. Унарное числовое расширение
 - •3.5.2. Бинарное числовое расширение
 - •4. Тип переменной и тип ее значения
 - •5. Заключение
 - •6. Контрольные вопросы
 - •Аннотация
 - •1. Введение
 - •2. Статические элементы
 - •3. Ключевые слова this и super
 - •4. Ключевое слово abstract
 - •5. Интерфейсы
 - •5.1. Объявление интерфейсов
 - •5.2. Реализация интерфейса
 - •5.3. Применение интерфейсов
 - •6. Полиморфизм
 - •6.1. Поля
 - •6.2. Методы
 - •6.3. Полиморфизм и объекты
 - •7. Заключение
 - •8. Контрольные вопросы
 - •Аннотация
 - •Лекция 9. Массивы
 - •1. Введение
 - •2. Массивы, как тип данных в Java
 - •2.1. Объявление массивов
 - •2.2. Инициализация массивов
 - •2.3. Многомерные массивы
 - •2.4. Класс массива
 - •3. Преобразование типов для массивов
 - •3.1. Ошибка ArrayStoreException
 - •3.2. Переменные типа массив, и их значения
 - •4. Клонирование
 - •4.1. Клонирование массивов
 - •5. Заключение
 - •6. Контрольные вопросы
 - •Аннотация
 - •Лекция 10. Операторы и структура кода
 - •1. Управление ходом программы
 - •2. Нормальное и прерванное выполнение операторов
 - •3. Блоки и локальные переменные
 - •4. Пустой оператор
 - •5. Метки
 - •6. Оператор if
 - •7. Оператор switch
 - •8. Управление циклами
 - •8.1. Цикл while
 - •8.2. Цикл do
 - •8.3. Цикл for
 - •9. Операторы break и continue
 - •9.1. Оператор continue
 - •9.2. Оператор break
 - •10. Именованные блоки
 - •11. Оператор return
 - •12. Оператор synchronized
 - •13.1. Причины возникновения ошибок
 - •13.2. Обработка исключительных ситуаций
 - •13.2.1. Конструкция try-catch
 - •13.2.2. Конструкция try-catch-finally
 - •13.3. Использование оператора throw
 - •13.4. Обрабатываемые и необрабатываемые исключения
 - •13.5. Создание пользовательских классов исключений
 - •13.6. Переопределение методов и исключения
 - •13.7. Особые случаи
 - •14. Заключение
 - •15. Контрольные вопросы
 - •Аннотация
 - •Лекция 11. Пакет java.awt
 - •1. Введение
 - •2. Апплеты
 - •2.1. Тег HTML <Applet>
 - •2.2. Передача параметров
 - •2.3. Контекст апплета
 - •2.4. Отладочная печать
 - •2.5. Порядок инициализации апплета
 - •2.6. Перерисовка
 - •2.7. Задание размеров графических изображений
 - •2.8. Простые методы класса Graphics
 - •2.9. Цвет
 - •2.9.1. Методы класса Color
 - •2.10. Шрифты
 - •2.10.1. Использование шрифтов
 - •2.10.2. Позиционирование и шрифты: FontMetrics
 - •2.10.3. Использование FontMetrics
 - •2.10.4. Центрирование текста
 - •3. Базовые классы
 - •4. Основные компоненты
 - •5. Менеджеры компоновки
 - •6. Окна
 - •7. Меню
 - •8. Обработка событий
 - •8.1. Рисование "каракулей" в Java
 - •8.2. Рисование "каракулей" с использованием встроенных классов
 - •9. Заключение
 - •10. Контрольные вопросы
 - •Аннотация
 - •Лекция 12. Потоки выполнения. Синхронизация
 - •1. Введение
 - •2. Многопоточная архитектура
 - •3. Базовые классы для работы с потоками
 - •3.1. Класс Thread
 - •3.2. Интерфейс Runnable
 - •3.3. Работа с приоритетами
 - •3.4. Демон-потоки
 - •4. Синхронизация
 - •4.1. Хранение переменных в памяти
 - •4.2. Модификатор volatile
 - •4.3. Блокировки
 - •5. Методы wait(), notify(), notifyAll() класса Object
 - •6. Контрольные вопросы
 - •Аннотация
 - •Лекция 13. Пакет java.lang.
 - •1. Введение
 - •2. Object
 - •3. Class
 - •4. Wrapper Classes
 - •4.1. Integer
 - •4.2. Character
 - •4.3. Boolean
 - •4.4. Void
 - •5. Math
 - •6. Строки
 - •6.1. String
 - •6.2. StringBuffer
 - •7. Системные классы
 - •7.1. ClassLoader
 - •7.2. SecurityManager - менеджер безопасности
 - •7.3. System
 - •7.4. Runtime
 - •7.5. Process
 - •8. Потоки исполнения
 - •8.1. Runnable
 - •8.2. Thread
 - •8.3. ThreadGroup
 - •9. Исключения
 - •10. Заключение
 - •11. Контрольные вопросы
 - •Аннотация
 - •Лекция 14. Пакет java.util
 - •1. Введение
 - •2. Работа с датами и временем
 - •2.1. Класс Date
 - •2.2. Классы Calendar и GregorianCalendar
 - •2.3. Класс TimeZone
 - •2.4. Класс SimpleTimeZone
 - •3. Интерфейс Observer и класс Observable
 - •4. Коллекции
 - •4.1. Интерфейсы
 - •4.1.1. Интерфейс Collection
 - •4.1.2. Интерфейс Set
 - •4.1.3. Интерфейс List
 - •4.1.4. Интерфейс Map
 - •4.1.5. Интерфейс SortedSet
 - •4.1.6. Интерфейс SortedMap
 - •4.1.7. Интерфейс Iterator
 - •4.2. Aбстрактные классы используемые при работе с коллекциями.
 - •4.3. Конкретные классы коллекций
 - •4.4. Класс Collections
 - •5. Класс Properties
 - •6. Интерфейс Comparator
 - •7. Класс Arrays
 - •8. Класс StringTokenizer
 - •9. Класс BitSet
 - •10. Класс Random
 - •11. Локализация
 - •11.1. Класс Locale
 - •11.2. Класс ResourceBundle
 - •12. Заключение
 - •13. Контрольные вопросы
 - •Аннотация
 - •Лекция 15. Пакет java.io
 - •1. Система ввода/вывода. Потоки данных (stream)
 - •1.1. Классы InputStream и OutputStream
 - •1.2. Классы-реализации потоков данных
 - •1.2.1. Классы ByteArrayInputStream и ByteArrayOutputStream
 - •1.2.2. Классы FileInputStream и FileOutputStream
 - •1.2.3. PipedInputStream и PipedOutputStream
 - •1.2.4. StringBufferInputStream
 - •1.2.5. SequenceInputStream
 - •1.3. Классы FilterInputStreeam и FilterOutputStream. Их наследники.
 - •1.3.1. BufferedInputStream и BufferedOutputStream
 - •1.3.2. LineNumberInputStream
 - •1.3.3. PushBackInputStream
 - •1.3.4. PrintStream
 - •1.3.5. DataInputStream и DataOutputStream
 - •2. Serialization
 - •2.1. Версии классов
 - •3. Классы Reader и Writer. Их наследники.
 - •4. Класс StreamTokenizer
 - •5. Работа с файловой системой.
 - •5.1. Класс File
 - •5.2. Класс RandomAccessFile
 - •6. Заключение
 - •7. Контрольные вопросы
 - •Аннотация
 - •Лекция 16. Введение в сетевые протоколы
 - •1. Основы модели OSI
 - •2. Physical layer (layer 1)
 - •3. Data layer (layer 2)
 - •3.1. LLC sublayer.
 - •3.2. MAC sublayer.
 - •4. Network layer (layer 3)
 - •4.1. Class A
 - •4.2. Class B
 - •4.3. Class CClass DClass E
 - •5. Transport layer (layer 4)
 - •6. Session layer (layer 5)
 - •7. Presentation layer (layer 6)
 - •8. Application layer (layer 7)
 - •9. Утилиты для работы с сетью
 - •9.1. IPCONFIG (IFCONFIG)
 - •9.3. Ping
 - •9.4. Traceroute
 - •9.5. Route
 - •9.6. Netstat
 - •9.7. Задания для практического занятия
 - •10. Пакет java.net
 - •11. Заключение
 - •12. Контрольные вопросы
 
Стр. 12 из 24  | 
	Основы объектно-ориентированного программирования  | 
Определенные сложности возникают при вызове перегруженных методов. В Java существуют специальные правила, которые решают эту проблему. Они будут рассмотрены в соответствующей главе.
1.5. Типы отношений между классами
Как правило, любая программа, написанная на объектно-ориентированном языке, представляет собой некоторый набор классов, связанных между собой. Можно провести аналогию между строительством дома и написанием программы. Подобно тому, как здание строится из кирпичей, компьютерная программа с использованием ООП строится из классов. Причем эти классы должны знать друг о друге, для того чтобы взаимодействовать между собой и сообща выполнить поставленную задачу.
Возможны следующие связи между классами в рамках объектной модели (приводятся лишь наиболее простые и часто используемые виды связей, подробное их рассмотрение выходит за рамки этой ознакомительной главы):
•Агрегация (Aggregation)
•Ассоциация (Association)
•Наследование (Inheritance)
•Метаклассы (Metaclass)
1.5.1. Агрегация
Отношение между классами типа "содержит" или "состоит из" называется агрегацией или включением. Например, если аквариум наполнен водой и в нем плавают рыбки, то можно сказать, что аквариум агрегирует в себе воду и рыбок.
Такое отношение включения или агрегации (aggregation) изображается линией с ромбиком на стороне того класса, который выступает в качестве владельца или контейнера. Необязательное название отношения записывается посередине линии.
Внашем примере отношение "contain" является двунаправленным. Объект класса Aquarium содержит несколько объектов Fish. В то же время каждая рыбка "знает", в каком именно аквариуме она живет. Факт участия класса в отношении изображается посредством роли.
Впримере можно видеть роль "home" класса Aquarium (аквариум является домом для рыбок), а также роль "inhabitants" класса Fish (рыбки являются обитателями аквариума). Название роли обычно совпадает с названием соответствующего поля в классе. Изображение такого поля на диаграмме излишне, если уже изображено имя роли. Т.е. в данном случае класс Aquarium будет иметь свойство (поле) inhabitants, а класс Fish - свойство home.
Число объектов, участвующих в отношении, записывается рядом с именем роли. Запись "0..n" означает "от нуля до бесконечности". Приняты так же обозначения:
•"1..n" - от единицы до бесконечности;
•"0" - ноль;
•"1" - один;
•"n" - фиксированное количество;
Программирование на Java
Rendered by www.RenderX.com
Типы отношений между классами  | 
	Стр. 13 из 24  | 
•"0..1" - ноль или один.
Код, описывающий рассмотренную модель и явление агрегации, может выглядеть, например, следующим образом:
// определение класса Fish public class Fish {
// определения поля home (ссылка на объект Aquarium) private Aquarium home;
public Fish() {
}
}
// определение класса Aquarium public class Aquarium {
// определения поля inhabitants (массив ссылок на объекты Fish) private Fish inhabitants[];
public Aquarium() {
}
}
1.5.2. Ассоциация
Если объекты одного класса ссылаются на один или более объектов другого класса, но ни в ту, ни в другую сторону отношение между объектами не носит характера "владения" или контейнеризации, то такое отношение называют ассоциацией (association). Отношение ассоциации изображается так же,как и отношение агрегации, но линия, связывающая классы - простая, без ромбика.
Вкачестве примера можно рассмотреть программиста и его компьютер. Между этими двумя объектами нет агрегации, но существует четкая взаимосвязь. Так, всегда можно установить за какими компьютерами работает какой-либо программист, а также какие люди пользуются отдельно взятым компьютером. В рассмотренном примере имеет место ассоциация многие-ко-многим.
Вданном случае между экземплярами классов Programmer и Computer в обе стороны используется отношение "0..n", т.к. программист теоретически может не пользоваться компьютером (если он теоретик или на пенсии). В свою очередь компьютер может никем не использоваться (если он новый и еще не установлен).
Код, соответствующий рассмотренному примеру, будет, например, следующим:
public class Programmer { private Computer computers[];
public Programmer() {
}
Программирование на Java
Rendered by www.RenderX.com
Стр. 14 из 24  | 
	Основы объектно-ориентированного программирования  | 
}  | 
	
  | 
public class Computer {
private Programmer programmers[];
public Computer() {
}
}
1.5.3. Наследование
Наследование (inheritance) - это отношение между классами, при котором класс использует структуру или поведение другого (одиночное наследование) или других (множественное наследование) классов. Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов. Подклассы обычно дополняют или переопределяют унаследованную структуру и поведение.
В качестве примера можно рассмотреть задачу, в которой необходимо реализовать классы "Легковой автомобиль" и "Грузовой автомобиль". Очевидно, эти два класса имеют много общей функциональности. Так, оба они имеют 4 колеса, двигатель, могут перемещаться и т.д. Всеми этими свойствами обладает любой автомобиль, не зависимо от того грузовой он или легковой, 5- или 12-местный. Разумно вынести эти общие свойства и функциональность в отдельный класс, например "Автомобиль", и наследовать от него классы "Легковой автомобиль" и "Грузовой автомобиль" чтобы избежать повторного написания одного и того же кода в разных классах.
Отношение обобщения обозначается сплошной линией с треугольной стрелкой на одном из концов. Стрелка указывает на более общий класс (класс-предок или суперкласс), а ее отсутствие - на более специальный класс (класс-потомок или подкласс)
Использование наследования способствует уменьшению количества кода, написанного для описания схожих сущностей, а так же способствует написанию более эффективного и гибкого кода.
В рассмотренном примере применено одиночное наследование. Некоторый класс так же может наследовать свойства и поведение сразу нескольких классов. Наиболее популярным примером применения множественного наследования является проектирование системы учета товаров в зоомагазине.
Все животные в зоомагазине являются наследниками класса "Животное", а также наследниками класса "Товар". Т.е. все они имеют возраст, нуждаются в пище и воде, и в то же время имеют цену и могут быть проданы.
Множественное наследование на диаграмме изображается точно так же как и одиночное наследование за исключением того, что линии наследования соединяют класс-потомок сразу с несколькими суперклассами.
Не все объектно-ориентированные языки программирования содержат в себе языковые конструкции для описания множественного наследования.
Многие объектно-ориентированные языки программирования не поддерживают множественное наследование и не имеют синтаксических конструкций для его реализации.
Программирование на Java
Rendered by www.RenderX.com
Типы отношений между классами Стр. 15 из 24
В языке Java множественное наследование имеет ограниченную поддержку через интерфейсы и будет рассмотрено в следующих главах.
1.5.4. Метаклассы
Итак, любой объект имеет структуру, состоящую из полей и методов. Объекты, имеющие одинаковую структуру и семантику, описываются одним классом, который и является, по сути, определением структуры объектов, порожденных от него.
В свою очередь каждый класс, или описание, всегда имеет строгий шаблон, задаваемый языком программирования или выбранной объектной моделью. Он определяет, например, допустимо ли множественное наследование, какие ограничения на имен½ование классов, как описываются п¿оля и методы, набор существующих типов данных и многое другое. Таким образом, класс можно рассматривать как объект, у которого есть свойства (имя, список полей и их типы, список методов, список аргументов для каждого метода и т.д.). Также класс может обладать поведением, то есть поддерживать методы. А раз для любого объекта существует шаблон, описывающий свойства и поведение этого объекта, то его можно определить и для класса. Такой шаблон, задающий различные классы, называется метакласс.
Чтобы легче представить себе, что такое метакласс, рассмотрим пример некой бюрократической организации. Будем считать, что все классы в такой системе - некоторые строгие инструкции, которые описывают, что нужно сделать, чтобы породить новый объект (например, нанять нового служащего или открыть новый отдел). Как и полагается классам, они описывают все свойства новых объектов (например, зарплату и профессиональный уровень для сотрудников, площадь и имущество для отделов) и их поведение (обязанности служащих и функции подразделений).
В свою очередь написание новой инструкции можно строго регламентировать. Скажем, необходимо использовать специальный бланк, придерживаться правил оформления и заполнить все обязательные поля (например, номер инструкции и фамилии ответственных работников) Такая "инструкция инструкций" и будет представлять собой метакласс в ООП.
Итак, объекты порождаются от классов, а классы - от метакласса. Он, как правило, в системе есть только один. Но существуют языки программирования, в которых можно создавать и использовать собственные метаклассы, например язык Python. Например, функциональность метакласса может быть следующая: при создании класса он будет просматривать список всех методов в классе и если имя метода имеет вид set_XXX или get_XXX, то автоматически создать поле с именем XXX, если такого не существует.
Поскольку метакласс сам является классом, то нет никакого смысла в заведении "мета- мета-классов".
В языке Java также есть такое понятие. Это класс, который так и называется - Class (описывает классы) и располагается в основной библиотеке java.lang. Виртуальная машина использует его по прямому назначению. Когда загружается очередной .class-файл, содержащий описание нового класса, JVM порождает объект класса Class, который будет хранить его структуру. Таким образом, Java использует концепцию метакласса в самых практических целях. С помощью Class реализована поддержка статических (static) полей и методов. Наконец, этот класс содержит ряд методов, полезных для разработчиков. Они будут рассмотрены в следующих главах.
Программирование на Java
Rendered by www.RenderX.com
