
- •Основы программирования на языке java в среде eclipse
- •Ответственный за выпуск: в.И. Павловський, зав. Кафедрою информационных и компьютерных систем, канд. Техн. Наук, доцент.
- •2.1 Задание на лабораторную работу 19
- •7.3 Порядок выполнения работы 103
- •7.4 Содержимое отчета 103
- •7.5 Контрольные вопросы 104
- •Введение
- •1Лабораторная работа №1 Изучение среды разработки Eclipse
- •1.1 Задание на лабораторную работу
- •1.2 Краткие теоретические сведения
- •1.2.1Создание проекта
- •1.2.2Создание нового класса Java
- •1.3 Порядок выполнения работы
- •1.4 Содержимое отчета
- •Краткие теоретические сведения.
- •1.5 Контрольные вопросы
- •2Лабораторная работа №2 Основы языка Java
- •2.1 Задание на лабораторную работу
- •2.2 Краткие теоретические сведения
- •2.2.1Создание объектов
- •2.2.2Примитивные типы
- •2.2.3Числа высокой точности
- •2.2.4Уничтожение объектов
- •2.2.5Видимость имен
- •2.2.6Использование других компонентов
- •2.2.7Ключевое слово static
- •2.2.8Массивы
- •2.2.9Обработка ошибок с помощью исключений
- •2.3 Порядок выполнения работы
- •2.4 Содержимое отчета
- •2.5 Контрольные вопросы и задания
- •3Лабораторная работа №3 Объектная модель языка Java
- •3.1 Задание на лабораторную работу
- •3.2 Краткие теоретические сведения
- •3.3 Порядок выполнения работы
- •Краткие теоретические сведения.
- •4.2 Краткие теоретические сведения
- •4.2.1Классы дерева и узла
- •4.2.2Вопросы сокрытия реализации
- •4.2.3Пользовательский интерфейс
- •4.3 Порядок выполнения работы
- •4.4 Содержимое отчета
- •Краткие теоретические сведения.
- •4.5 Контрольные вопросы
- •5Лабораторная работа №5 Изучение основ объектно-ориентированного программирования на языке Java. Часть 2
- •5.1 Задание на лабораторную работу
- •5.2 Краткие теоретические сведения
- •5.2.1Классы деревьев и интерфейсы
- •5.2.2Рекурсивный проход по деревьям разных классов
- •5.2.3Расширение ранее созданных классов специфическими операциями пользователей
- •5.2.4Вопросы оптимизации кода
- •5.3 Порядок выполнения работы
- •5.4 Содержимое отчета
- •Краткие теоретические сведения.
- •5.5 Контрольные вопросы
- •6Лабораторная работа №6 Изучение коллекций Java и системы ввода-вывода
- •6.1 Задание на лабораторную работу
- •6.2 Краткие теоретические сведения
- •6.2.1Представление и реализация дерева на основе коллекций
- •В описании узла дерева необходимо создать и инициализировать объект класса список или набор сыновей, например
- •Количество сыновей узла дерева определяется следующим образом:
- •Элементу набора с индексом I выполняется путем получения массива из набора
- •6.2.2Представление и реализация дерева на основе ассоциативных массивов (карт отображений)
- •В описании узла дерева необходимо создать и инициализировать объект ассоциативный массив сыновей, например
- •Количество сыновей узла дерева определяется следующим образом:
- •6.2.3Доступ к коллекции или ассоциативному массиву через итератор
- •6.2.4Использование обобщений Java 5
- •В описании узла дерева необходимо создать и инициализировать коллекцию настраиваемый список, например
- •6.2.5Сериализация и десериализация дерева в файл
- •6.2.6Ввод и вывод в потоки со сжатием данных
- •6.3 Порядок выполнения работы
- •Краткие теоретические сведения.
- •7.2 Краткие теоретические сведения
- •7.2.1Многопоточность
- •7.2.2Процессы, потоки и приоритеты
- •7.2.3Приоритеты потоков в приложениях Java
- •7.2.4Реализация многопоточности в Java
- •7.2.5Функциональность класса Thread
- •7.2.6Реализация интерфейса Runnable
- •7.2.7Синхронизация потоков
- •7.2.8Синхронизация методов
- •7.2.9Блокировка потока
- •7.2.10Синхронизация доступа к совместно используемым данным.
- •7.2.11Избыточная синхронизация
- •7.2.12Вызов метода wait
- •7.2.13Документирование уровней безопасности
- •7.2.14Работа с графикой Графика 2d
- •Пространства координат
- •Режим рисования
- •Создание цвета
- •Основные методы рисования
- •Рисование фигур средствами Java2d
- •Класс BasicStroke
- •Класс GeneralPath
- •Классы GradientPaint и TexturePaint
- •7.3 Порядок выполнения работы
- •7.4 Содержимое отчета
- •Краткие теоретические сведения;
- •7.5 Контрольные вопросы
- •Многопоточность;
- •Рекомендованная литература
6.2.4Использование обобщений Java 5
Обобщения (generics) идеологически подобны шаблонам С++, хотя имеют другую внутреннюю реализацию. Целесообразность их использования в рамках данной лабораторной работы вытекает из сделанного выше примечания, а именно, что коллекции содержат ссылки типа Object и поэтому при выборе элемента коллекции его приходится специально типизировать.
Обобщения позволяют настроить коллекции на конкретный тип объекта, так что при выборе элемента коллекции не требуется его специальной типизации. Покажем это на примере коллекции ArrayList.
Общая структура использования настраиваемых коллекций следующая:
В описании узла дерева необходимо создать и инициализировать коллекцию настраиваемый список, например
class ListNode implements INode{
//Информационные поля для узла дерева
List<INode> listSon = new ArrayList<INode>();
//Методы узла дерева
}
Доступ к сыну узла дерева элементу списка с индексом i выполняется следующим образом
node = listSon.get(i);//не требуется приведение типов |
Следует обратить внимание на отсутствие специальной типизации ссылки, получаемой из коллекции. Однако если использовать конструкцию
node = (INode)listSon.toArray()[i]; |
то требуется типизация, т.к. toArray() возвращает Object и тем самым разрушает настройки List<INode>.
6.2.5Сериализация и десериализация дерева в файл
Сериализация (serialization) – это процесс записи состояния объекта в форме байтового потока. Позднее объект можно восстановить, используя процесс десериализации (deserialization).
Средства сериализации и десериализации разработаны для работы с объектами, расположенными в вершине ориентированного, возможно циклического, графа связей между объектами. Дерево является частным случаем такого графа.
Если выполняется сериализация объекта, расположенного в вершине ориентированного графа, то все другие - связанные с ним, объекты выстраиваются в рекурсивную последовательность и сериализуются. Аналогично в процессе десериализации все эти объекты и их ссылки будут восстанавливаться в правильную иерархическую структуру.
Интерфейс Serializable. Чтобы объект мог быть сериализован, его класс должен реализовать этот интерфейс. Сам интерфейс никаких методов не определят, он только указывает, что объект может быть сериализован без дополнительных уточнений (контроля) программиста. Если класс сериализован, то все его подклассы также сериализованы.
Интерфейс ObjectOutput. Расширяет интерфейс DataOutput и поддерживает сериализацию объектов. Содержит несколько методов. Наиболее интересным является метод void writeObject (Object obj). Он вызывается, чтобы сериализовать объект.
Класс ObjectOutputStream. Расширяет интерфейс OutputStream и реализует интерфейс ObjectOutput. Класс обеспечивает запись объектов в поток. Конструктор этого класса имеет вид:
ObjectOutputStream (OutputStream outStream) throws IOException,
где outStream - выходной поток, в который записываются сериализованные объекты.
Интерфейс ObjectInput. Расширяет интерфейс DataIntput и поддерживает десериализацию объектов. Содержит несколько методов. Наиболее интересным является метод Object readObject (). Он вызывается, чтобы десериализовать объект.
Класс ObjectInputStream. Расширяет интерфейс InputStream и реализует интерфейс ObjectInput. Класс обеспечивает чтение объектов из потока. Конструктор этого класса имеет вид
ObjectInputStream(InputStream inStream) throws IOException, StreamCorruptedException,
где inStream - входной поток, из которого считываются сериализованные объекты.
Общая структура использования сериализации следующая:
Подключить библиотеку java.io.* и указать, что соответствующий класс реализует интерфейс Serializable;
import java.io.*;
class ListTree implements ITree, Serializable{
//тело класса
}
Для сериализации объекта класса ListTree, необходимо создать поток вывода в файл и провести запись объекта в этот поток:
FileOutputStream fos = new FileOutputStream ("TreeSerial");
ListTree tree = new ListTree(); //Операции по заполнению дерева … try{ //создаем поток вывода для сериализации объекта tree ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("tree.dat")); out.writeObject(tree); //сериализуем объект out.close(); //закрываем поток } catch(IOException e){ //обработка исключительной ситуации }
|
Общая структура использования десериализации во многом подобна структуре использования сериализации и очевидна из приводимого ниже текста:
try{ //создаем поток ввода для десериализации объекта tree ObjectInputStream in = new ObjectInputStream( new FileInputStream("tree.dat")); tree=(ListTree)in.readObject(); //десериализуем объект in.close(); //закрываем поток } catch(IOException e){ //обработка исключений }
|