- •Аннотация
- •Лекция 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. Контрольные вопросы
Полиморфизм и объекты |
Стр. 21 из 27 |
•объявленными в его родительском классе и реализуемых интерфейсов, кроме:
-private-элементов;
-"скрытых" элементов (полей и статических методов, скрытых одноименными элементами);
-переопределенных методов (динамических методов).
А во-вторых, продолжим рассмотрение взаимосвязи типа переменной и типов ее возможных значений. К случаям, рассмотренным в прошлой главе, добавляются два особых случая. Переменная типа абстрактный класс может ссылаться на объекты, порожденные неабстрактным наследником этого класса. Переменная типа интерфейс может ссылаться на объекты, порожденные от класса, реализующего этот интерфейс.
Сведем эти данные в таблицу:
|
Тип переменной |
Допустимые типы ее значения |
Абстрактный класс |
• |
null |
|
• |
неабстрактный наследник |
Интерфейс |
• |
null |
|
• |
классы, реализующие интерфейс, а именно: |
|
|
- напрямую реализующие (заголовок содержит imple- |
|
|
ments); |
|
|
- наследующиеся от реализующих классов; |
|
|
- реализующие наследников этого интерфейса; |
|
|
- смешанный случай - наследование от класса, |
|
|
реализующего наследника интерфейса |
Таким образом, Java предоставляет гибкую и мощную модель объектов, позволяющую проектировать самые сложные системы. Необходимо хорошо разбираться в ее основных свойствах и механизмах - наследование, статические элементы, абстрактные элементы, интерфейсы, полиморфизм, разграничения доступа и другие. Все они позволяют избегать дублирующего кода, облегчают развитие системы, добавление новых возможностей и изменение старых, помогают обеспечивать минимальную связность между частями системы, то есть, повышают модульность. Также удачные технические решения можно многократно использовать в различных системах, сокращая и упрощая процесс их создания.
Для достижения таких важных целей требуется не только знание Java, но и владение объектно-ориентированным подходом, основными способами проектирования систем и проверки качества архитектурных решений. Платформа Java является основой и весьма удобным инструментом для применения всех этих технологий.
7. Заключение
В этой главе были рассмотрены особенности объектной модели Java. Это, во-первых, статические элементы, позволяющие использовать интерфейс класса без создания объектов. Нужно помнить, что, хотя для обращения к статическим элементам можно использовать ссылочную переменную, на самом деле ее значение не используется, компилятор основывается только на ее типе.
Для правильной работы со статическими элементами вводятся понятия статического и динамического контекста.
Программирование на Java
Rendered by www.RenderX.com
Стр. 22 из 27 |
Контрольные вопросы |
Далее рассматривалось использование ключевых слов this и super. Выражение this предоставляет ссылку, указывающую на объект, в контексте которого оно встречается. Оно помогает избегать конфликтов имен, а также применяется в конструкторах.
Слово super предоставляет возможность использовать свойства родительского класса, что необходимо для реализации переопределенных методов, а также в конструкторах.
Затем было введено понятие абстрактного метода и класса. Абстрактный метод не имеет тела, он лишь указывает, что метод с такой сигнатурой должен быть реализован в классенаследнике. Поскольку он не имеет собственной реализации, классы с абстрактными методами также должны быть объявлены с модификатором abstract, который указывает, что от них нельзя порождать объекты. Основная цель абстрактных методов – описать в родительском классе как можно больше общих свойств наследников, пускай даже и в виде заголовков методов без реализации.
Следующее важное понятие – особый тип в Java, интерфейс. Его еще называют полностью абстрактным классом, так как все его методы обязательно абстрактные, а поля final static. Соответственно, на основе интерфейсов невозможно создавать объекты.
Интерфейсы являются альтернативой множественному наследованию. Классы не могут иметь более одного родителя, но они могут реализовывать сколько угодно интерфейсов. Таким образом, интерфейсы описывают общие свойства классов, не находящихся на одной ветви дерева наследования.
Наконец важным свойством объектной модели является полиморфизм. Были подробно изучены детали поведения полей и методов, как статических, так и динамических, при переопределении. После этого рассмотрения становится возможным развить вопрос соответствия типов переменной и ее значения.
8. Контрольные вопросы
8-1. Предположим, вы моделируете автомобиль, описывая его свойства в формате Javaкласса. Какие из следующих полей нужно объявить динамическими, а какие – статическими?
•количество колес автомобиля;
•необходимое количество колес, полагающееся по проектной документации;
•максимально допустимая масса для этого класса автомобилей;
•максимально большое количество пассажиров, когда-либо одновременно перевозимых автомобилем;
•дата начала выпуска автомобилей;
•дата выпуска автомобиля.
a.) 1, 4, 6 – динамические, поскольку описывают свойства конкретного автомобиля
2, 3, 5 – статические, поскольку описывают свойства, присущие всем автомобилям этого класса.
8-2. Корректно ли следующее обращение к переменной x?
Программирование на Java
Rendered by www.RenderX.com
Стр. 23 из 27
public class Test { static void perform() {
...
}
private Test x;
public static void main(String s[]) { x.perform(); // корректно ли это выражение?
}
}
a.) Нет, не корректно. Хотя при обращении к статическим элементам через имя переменной, используется лишь ее тип, а не значение, в данном примере производится попытка обратиться к динамической переменной из статического метода, чего делать нельзя, несмотря на то, что для вычисления выражения требуется лишь тип переменной.
8-3. Что окажется на консоли после выполнения следующей программы?
public class Parent { int x=2;
}
public class Child extends Parent { int x=3;
void print(int x) { System.out.println(x); System.out.println(this.x); System.out.println(super.x);
}
public static void main(String s[]) { new Child().print(0);
}
}
a.) Результатом будет:
0
3
2
В первом случае распечатывается значение аргумента метода, который передается из метода main, то есть 0. Во втором случае распечатывается значение переменной, объявленной в классе Child, то есть 3. Наконец, в
Программирование на Java
Rendered by www.RenderX.com
Стр. 24 из 27 |
Контрольные вопросы |
последнем случае распечатывается значение переменной, унаследованной от родительского класса Parent, то есть 2.
8-4. Для каких целей может быть использовано ключевое слово this?
a.) Для следующих целей:
•обращение из первой строки конструктора к другому конструктору этого же класса.
•получение ссылки на текущий объект, что может потребоваться в следующих случаях:
-передача ссылки на сам объект в качестве аргумента вызываемого метода
-разрешения конфликта имен в случае «затеняющих» объявлений
-использование для инициализации одного поля другого поля, объявленного ниже
•также это слово применяется при работе с внутренними типами, что выходит за рамки этого курса
8-5. Можно ли при переопределении некоторого абстрактного метода perform() использовать выражение super.perform()?
a.) Нет, выражение super.perform() означает полноценный вызов родительского метода, что невозможно, если у него отсутствует тело, что верно для абстрактных методов.
8-6. Можно ли при наследовании не реализовывать абстрактный метод родительского класса?
a.) Можно, но тогда наследник должен оставаться абстрактным.
8-7. Если есть переменная типа абстрактный класс, можно ли с ее помощью обращаться к абстрактным методам этого класса?
a.) Да, поскольку ее значение, не равное null, будет ссылаться на объект, порожденный от неабстрактного класса-наследника. Следовательно, в нем реализованы все абстрактные методы.
8-8. Какие модификаторы элементов интерфейса подставляются по умолчанию, а потому не рекомендованы для явного указания?
a.) Для полей – public final static.
Для методов – public abstract.
8-9. Возможно ли не реализовывать все методы из интерфейса, указанного в выражении implements?
a.) Да, но такой класс должен быть объявлен абстрактным.
Для методов – public abstract.
Программирование на Java
Rendered by www.RenderX.com
Стр. 25 из 27
8-10. Есть ли какие-либо ограничения на набор интерфейсов, которые может реализовывать класс?
a.) Да, они не могут иметь различных методов с одинаковыми сигнатурами, то есть различающихся типом возвращаемого значения.
8-11. Для каких элементов класса работает полиморфизм?
a.) Только для динамических методов.
8-12. Какое значение появится на консоли после выполнения следующей программы?
public class Parent { int x = 2;
public void print() { System.out.println(x);
}
}
public class Child extends Parent { int x = 3;
public static void main(String s[]) { new Child().print();
}
}
a.) Появится число 2, так как выводом занимается метод класса Parent, то и переменная будет использована та, что объявлена в этом классе.
8-13. Изменится ли результат программы из предыдущего вопроса, если добавить в объявление класса Child следующие строки?
public void print() { System.out.println(x);
}
a.) Хотя переопределенный метод выглядит точно так же, как и родительский, однако теперь он использует переменную класса Child, поэтому результатом будет 3.
8-14. Корректен ли следующий пример, и если да, то что появится после его выполнения?
public class Test {
public static void test(Test t) { System.out.println(“test ”+t);
}
public static void main(String s[]) { Test t = null;
t.test(t);
Программирование на Java
Rendered by www.RenderX.com
Стр. 26 из 27 |
Контрольные вопросы |
}
}
a.) Пример корректен, значение типа null подходит как для обращения к статическому элементу, так и для передачи в качестве аргумента. Результатом работы метода test станет текст test null.
8-15. Может ли переменная иметь тип абстрактный класс? Интерфейс? Если да, то какие значения она может хранить?
a.) Оба ответа – да, может. В обоих случаях переменные могут принимать значение null. Также переменная типа абстрактный класс может ссылаться на объекты, порожденные от неабстрактных классов-наследников. В случае переменных типа интерфейс, они могут ссылаться на объекты неабстрактных классов, реализующих этот интерфейс.
Программирование на Java
Rendered by www.RenderX.com