- •Аннотация
- •Лекция 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. Контрольные вопросы
Версии классов |
Стр. 23 из 34 |
private String name; String lastName;
}
Для отслеживания таких ситуаций, каждому классу присваивается его идентификатор (ID) версии. Он представляет собой число long (длина 64 бита), полученное при помощи хэшфункции. Для его вычисления используются имена классов, всех реализуемых интерфейсов, всех методов и полей класса. При десериализации объекта, идентификаторы класса и идентификатор, взятый из потока сравниваются.
Изменения, проводимые с классом можно разбить на две группы - совместимые, то есть изменения, которые можно производить в классе, и при этом поддерживать совместимость с ранними версиями, и несовместимые - изменения, нарушающие поддержку с ранней версией класса. Определить к какому типу относится изменение, можно, руководствуясь следующей логикой: так как предполагается, что поздние версии будут поддерживать более ранние, то поздние должны иметь такой набор полей, что в них возможно восстановить поля из старых записей.
Итак, к совместимым относятся следующие изменения:
•добавление поля к классу
•добавление или удаление суперкласса
•изменение модификаторов доступа полей
•удаление у полей модификаторов static или transient
•изменение кода методов, инициализаторов, конструкторов К несовместимым относятся:
•Удаление поля
•изменение название пакета класса
•изменение типа поля
•добавление к полю экземпляра ключевого слова static или transient
•реализация Serializable вместо Externalizable или наоборот.
Другими словами, должна остаться возможность восстановить именно те поля, которые были записаны в поток при сериализации.
Обеспечение такой совместимости может стать неприятной задачей, если не позаботиться об этом заранее. В таких случаях сразу следует объявить, что класс реализует интерфейс
Externalizable, и потом просто дорабатывать методы readExternalizable и writeExternalizable.
3. Классы Reader и Writer. Их наследники.
Рассмотренные классы - наследники InputStream и OutputStream работают с байтовыми данными. При этом, в обращении со строковыми данными поддерживаются 8-ми битные символы и зачастую неверно происходит при интернационализации обращение с 16-ти битными символами Unicode - именно на которых и основан примитивный тип char(символ) в Java. За правильное использование символов в операциях ввода/вывода предназначены
Программирование на Java
Rendered by www.RenderX.com
Стр. 24 из 34 |
Классы Reader и Writer. Их наследники. |
наследники классов Reader (чтение) и Writer (запись). Их иерархия представлена диаграммой на рис.3 .
Эта иерархия очень схожа с аналогичной для байтовых потоков InputStream и OutputStream.
В таблице 1 приведены соответствия классов для байтовых и символьных потоков.
InputStream |
Reader |
OutputStream |
Writer |
ByteArrayInputStream |
CharArrayReader |
ByteArrayOutputStream |
CharArrayWriter |
Нет аналога |
InputStreamReader |
Нет аналога |
OutputStreamWriter |
FileInputStream |
FileReader |
FileOutputStream |
FileWriter |
FilterInputStream |
FilterReader |
FilterOutputStream |
FilterWriter |
BufferedInputStream |
BufferedReader |
BufferedOutputStream |
BufferedWriter |
PrintStream |
PrintWriter |
DataInputStream |
Нет аналога |
DataOutputStream |
Нет аналога |
ObjectInputStream |
Нет аналога |
ObjectOutputStream |
Нет аналога |
PipedInputStream |
PipedReader |
PipedOutputStream |
PipedWriter |
Программирование на Java |
|
Rendered by www.RenderX.com
Стр. 25 из 34
StringBufferInputStream |
StringReader |
Нет аналога |
StringWriter |
LineNumberInputStream |
LineNumberReader |
PushBackInputStream |
PushBackReader |
SequenceInputStream |
Нет аналога |
Как видно из таблицы, различия крайне незначительны:
Для символьных потоков нет потока, аналогичного потоку SequenceInputStream последовательного считывания, и, конечно же, отсутствует преобразование в символьное представление примитивных типов Java и объектов (DateInput/Output, ObjectInput/Output).
В свою очередь, в символьных потоках присутствует поток записи символьных данных в строку, чего нет для байтовых потоков (скорее в силу излишества такой надобности при использовании байтовых потоков). Кроме того, в символьных потоках имеются классымосты, преобразующие символьные потоки в байтовые: InputStreamReader и OutputStreamWriter .
Можно обратить внимание и на остальные различия, которые впрочем, являются незначительными:
•Если классы - основы фильтров для символьных потоков: FilterReader и FilterWriter являются абстрактными, то аналогичные для байтовых: InputStream и OutputStream - не абстрактные.
•Методы: close класса Reader и flush и close класса Writer являются абстрактными, в то время как в соответствующих классах InputStream и OutputStream байтовых потоков они имеют просто пустую реализацию
•BufferedReader наследуется не от фильтра FilterReader, а напрямую от Reader
•LineNumberReader не наследуется от FilterReader, вместо этого он унаследован от BufferedReader, который в свою очередь напрямую унаследован от Reader
•FileReader и FileWriter унаследованы от классов-мостов InputStreamReader и OutputStreamWriter
•Метод available() класса InputStream, отсутствует в классе Reader, он заменен методом ready() - возвращающим вместо количества данных готовых к считыванию, булевое значение - готов ли поток к считыванию (то есть будет ли считывание произведено без блокирования)
В остальном же, использование символьных потоков идентично работе с байтовыми потоками. Так, программный код для записи символьных данных в файл, будет выглядеть примерно следующим образом:
String fileName = "d:\\file.txt"; FileWriter fw = null; BufferedWriter bw = null; FileReader fr = null; BufferedReader br = null;
//Строка, которая будет записана в файл
String data = "Some data to be written and readed\n";
Программирование на Java
Rendered by www.RenderX.com
Стр. 26 из 34 Класс StreamTokenizer
try{
fw = new FileWriter(fileName); bw = new BufferedWriter(fw);
System.out.println("Write some data to file: " + fileName); // Несколько раз записать строку
for(int i=(int)(Math.random()*10);--i>=0;)bw.write(data); bw.close();
fr = new FileReader(fileName); br = new BufferedReader(fr); String s = null;
int count = 0;
System.out.println("Read data from file: " + fileName); // Считывать данные, отображая на экран while((s=br.readLine())!=null)
System.out.println("row " + ++count + " read:" + s); br.close();
}catch(Exception e){ e.printStackTrace();
}
Классы-мосты InputStreamReader и OutputStreamWriter имеют возможность производить преобразование символов, используя различные кодировки. Кодировка задается при конструировании потока, путем передачи в конструктор в качестве параметра строки - названия кодировки. При указании названия, которое не соответствует никакой из известных кодировок, будет брошено исключение UnsupportedEncodingException. Вот некоторые из допустимых значений этой строки: "Cp1521", "UTF-8", "8859_1", "8859_2" и т.д..
4. Класс StreamTokenizer
Этот класс создается поверх существующего объекта либо InputStream либо Reader. Позволяет работать с данными посредством токенов - кусков данных, выделяемых из потока по определенным свойствам. Процесс разбора данных контролируется через таблицу со множеством флагов котрые могут быть выставлены в различные состояния. StreamTokenizer может распознавать идентификаторы, числа, строки в кавычках и различные стили комментариев. Обычно приложение сначала создает экземпляр этого класса, выставляет синтаксические таблицы, после чего многократно повторяет в цикле вызов метода nextToken, пока не будет возвращено значение StreamTokenizer.TT_EOF.
После вызова метода nextToken поле ttype содержит значение определяющее тип последнего считанного токена. Если последний считанный токен распознан как число, его значение содержится в поле nval. Если же токен распознан как слово, его значение заносится в поле sval.
Способ определения, как разбивать данные на эти куски - настраивается вызовом методов commentChar, ordinaryChar, parseNumbers, quoteChar, resetSyntax, slashSlashComments, slashStarComments, whitespaceChars, wordChars. По умолчанию используются такие настройки, что будут выделяться числа, и тексты(символы с соответствующими кодами) разделяемые переводом строки.
Программирование на Java
Rendered by www.RenderX.com